어셈블리(ASP)의 웹 응용 프로그램 버전 번호 사용.NET/C#)
참조된 어셈블리에서 호출 중인 웹 응용 프로그램의 버전 번호를 가져오려면 어떻게 해야 합니까?
시스템을 사용해 보았습니다.반사.어셈블리.호출 어셈블리()를 가져옵니다.GetName()은 동적으로 컴파일된 어셈블리(0.0.0.0 버전 번호 반환)를 제공합니다.
업데이트: 웹 애플리케이션 어셈블리 내의 클래스를 다시 참조할 필요가 없는 솔루션이 필요했습니다.아래 Jason의 답변(승인된 것으로 표시됨)은 이 요구 사항을 충족합니다. 여기에 제출된 많은 다른 답변은 충족하지 못합니다.
웹 또는 비웹 앱에서 응용 프로그램의 "기본" 어셈블리를 가져오는 것을 지원하는 코드가 있습니다. 그런 다음 GetName()을 사용할 수 있습니다.버전을 가져올 버전입니다.
먼저 웹이 아닌 앱에 대해 GetEntryAssembly()를 시도합니다.ASP에서 null을 반환합니다.NET. 그런 다음 HttpContext를 봅니다.웹 응용 프로그램인지 확인하는 현재입니다.그런 다음 현재 HttpHandler의 유형을 사용하지만 이 유형의 어셈블리는 생성된 ASP일 수 있습니다.호출이 ASPX 페이지를 사용하여 이루어진 경우 NET 어셈블리입니다. 따라서 해당 ASP가 네임스페이스에 없는 형식을 찾을 때까지 HttpHandler의 BaseType 체인을 통과합니다.NET은 생성된 유형("ASP")에 사용됩니다.이것은 일반적으로 기본 어셈블리의 유형입니다(예:코드 뒤에 있는 파일의 페이지).그런 다음 해당 유형의 어셈블리를 사용할 수 있습니다.그렇지 않으면 GetExecutingAssembly()로 돌아갑니다.
이 접근 방식에는 여전히 잠재적인 문제가 있지만 응용 프로그램에서 작동합니다.
private const string AspNetNamespace = "ASP";
private static Assembly getApplicationAssembly()
{
// Try the EntryAssembly, this doesn't work for ASP.NET classic pipeline (untested on integrated)
Assembly ass = Assembly.GetEntryAssembly();
// Look for web application assembly
HttpContext ctx = HttpContext.Current;
if (ctx != null)
ass = getWebApplicationAssembly(ctx);
// Fallback to executing assembly
return ass ?? (Assembly.GetExecutingAssembly());
}
private static Assembly getWebApplicationAssembly(HttpContext context)
{
Guard.AgainstNullArgument(context);
object app = context.ApplicationInstance;
if (app == null) return null;
Type type = app.GetType();
while (type != null && type != typeof(object) && type.Namespace == AspNetNamespace)
type = type.BaseType;
return type.Assembly;
}
업데이트: 이 코드를 GitHub과 NuGet의 작은 프로젝트로 롤업했습니다.
동적 어셈블리 대신 "메인" 어셈블리의 버전을 얻는 가장 간단한 한 줄 방법은 다음과 같습니다.
typeof(MyMainClass).Assembly.GetName().Version
노력의 리터링작의일하업대가없능이최다클는같니사다합용래이과음스를위팩상체성될나거변의환으로서 사용하세요.MyMainClass
이 클래스가 어떤 어셈블리에서 정의되는지 알고 있으므로 버전 번호가 어디서 왔는지에 대해 더 이상 혼동할 수 없습니다.
저는 웹이 더 좋습니다.사이트의 현재 버전을 저장하도록 구성합니다.
웹 응용 프로그램 루트에 다음과 같은 AssemblyInfo.cs 파일을 생성할 수도 있습니다.
using System.Reflection;
using System.Runtime.CompilerServices;
...
[assembly: AssemblyVersion("1.0.*")]
...
그런 다음 다음 코드를 통해 값에 액세스합니다.
System.Reflection.Assembly.GetExecutingAssembly()
다음은 의회에 대한 자세한 정보입니다.정보 클래스.
이미 게시한 응답자에 추가합니다.ASP에서 어셈블리 버전을 가져오려면 다음과 같이 하십시오.Net 웹 응용 프로그램은 다음과 유사한 메서드를 파일 뒤에 있는 코드에 배치해야 합니다.
protected string GetApplicationVersion() {
return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
ASPX 페이지에서 버전 번호를 표시하려면 다음을 입력합니다.
<%= GetApplicationVersion() %>
아직 관심 있는 사람이 있을 경우를 대비해; 이것은 속임수를 쓸 수 있고 그냥 가져가는 것보다 조금 더 안전해야 합니다.BaseType
ApplicationInstance
Global.asax 구현을 직접 확인할 수 있습니다.
Global.asax는 항상 AssemblyInfo.cs 의 어셈블리 속성과 동일한 어셈블리로 컴파일되므로 Global.asax를 정의하는 모든 웹 응용 프로그램에 대해 작동합니다.
자신의 Global.asax를 정의하지 않는 사용자의 경우 생성된 버전으로 돌아갑니다.global_asax
항상 0.0.0.0인 유형이며 웹 응용 프로그램이 아닌 응용 프로그램의 경우 버전을 전혀 반환하지 않습니다.
너스보 ; 용사▁theBuildManager
클래스에 활성이 필요하지 않습니다.HttpContext
인스턴스. 즉, 응용 프로그램 시작 코드에서도 이 인스턴스를 사용할 수 있어야 합니다.
public static Version GetHttpApplicationVersion() {
Type lBase = typeof(HttpApplication);
Type lType = BuildManager.GetGlobalAsaxType();
if (lBase.IsAssignableFrom(lType))
{
while (lType.BaseType != lBase) { lType = lType.BaseType; }
return lType.Assembly.GetName().Version;
}
else
{
return null;
}
}
HttpContext입니다.현재의.어플인스턴스는 global.asax.cs 의 클래스에서 파생됩니다.다음을 수행할 수 있습니다.
var instance = HttpContext.Current.ApplicationInstance;
Assembly asm = instance.GetType().BaseType.Assembly;
System.Version asmVersion = asm.GetName().Version;
ASP에서 모두 작동합니다.NET(ASPX) 및 ASP.NET MVC
저도 비슷한 문제에 부딪혔고, 그 해결책이 유용할 것이라고 생각했습니다.
서버 컨트롤이 다른 라이브러리에 포함된 사용자 정의 서버 컨트롤에서 현재 응용프로그램 버전(웹 응용프로그램 프로젝트)을 보고해야 했습니다.문제는 "가장 쉬운" 어셈블리 게터가 올바른 어셈블리를 제공하지 않았다는 것입니다.
Assembly.GetExecutingAssembly()
응용 프로그램 어셈블리가 아닌 컨트롤을 포함하는 어셈블리를 반환했습니다.Assembly.GetCallingAssembly()
호출 트리의 위치에 따라 다른 어셈블리를 반환했습니다(일반적으로 시스템).웹 및 때때로 컨트롤을 포함하는 어셈블리.Assembly.GetEntryAssembly()
된 환된반null
.new StackTrace().GetFrames()[idx].GetMethod().DeclaringType.Assembly
인스에스추프적레어임검셈다니색합에 있는 합니다.idx
그러나 프레임 인덱스에서 우아하지 않고 비용이 많이 들고 계산이 잘못되기 쉬운 것 외에도 스택 추적에 응용 프로그램 어셈블리에 대한 호출이 포함되지 않을 수 있습니다.Assembly.GetAssembly(Page.GetType())
나에게 점수를 주었습니다.App_Web_@#$@#$%@
동적으로 생성된 페이지를 포함하는 어셈블리입니다.물론 동적 페이지는 애플리케이션 어셈블리에서 클래스를 상속하므로 최종 솔루션은 다음과 같습니다.
Assembly.GetAssembly(Page.GetType().BaseType)
어셈블리 참조를 사용하여 이름을 통해 버전으로 드릴링할 수 있습니다.
var version = Assembly.GetAssembly(Page.GetType().BaseType)
.GetName()
.Version;
애플리케이션 어셈블리에서 유형에 대한 참조가 있었기 때문에 이 솔루션이 작동합니다.코드를 상속하지 않는 페이지는 사용하지 않으므로 우연히도 유효하지만, 귀사의 코딩 관행이 다를 경우 마일리지가 달라질 수 있습니다.
해피 코딩!
Version version = new Version(Application.ProductVersion);
string message = version.ToString();
일부 정보: http://www.velocityreviews.com/forums/showpost.php?p=487050&postcount=8
asp.net 2.0에서는 각 페이지가 자체 어셈블리에 내장되어 있으므로 AssemblyInfo.cs 이 내장된 DLL만 정답을 반환합니다.버전 정보를 반환하는 정적 메서드를 AssemblyInfo.cs 에 추가하고 다른 페이지에서 이 메서드를 호출합니다.
브루스(sqlwork.com )
하지만 저는 이를 위한 간단한 방법을 썼습니다.
public static string GetSystemVersion(HttpServerUtility server)
{
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(server.MapPath("~/web.config"));
System.Xml.XmlNamespaceManager ns = new System.Xml.XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("bla", "http://schemas.microsoft.com/.NetConfiguration/v2.0");
System.Xml.XmlNode node = doc.SelectSingleNode("/bla:configuration/bla:system.web/bla:authentication/bla:forms[@name]", ns);
string projectName = "";
if (node != null && node.Attributes != null && node.Attributes.GetNamedItem("name") != null)
projectName = node.Attributes.GetNamedItem("name").Value; //in my case, that value is identical to the project name (projetname.dll)
else
return "";
Assembly assembly = Assembly.Load(projectName);
return assembly.GetName().Version.ToString();
}
만약 당신이 웹 컨트롤에서 이것을 찾고 있다면, 한 가지 해킹은 코드 뒤에 있는 페이지의 종류를 찾는 것입니다.시스템에서 상속되는 클래스입니다.웹.UI.페이지). 일반적으로 소비자의 웹 어셈블리에 있습니다.
Type current, last;
current = Page.GetType();
do
{
last = current;
current = current.BaseType;
} while (current != null && current != typeof(System.Web.UI.Page));
return last;
저는 더 좋은 방법이 있기를 바랍니다.
이 질문은 웹 응용 프로그램 유형에 대한 지식이 없는 상태에서 (원래) 말하지 않은 참조(인스턴스)가 없음을 나타냅니다.
OP를 편집하여 호출하는 웹 어셈블리 내에서 유형에 대한 지식이 필요하지 않으므로 답변이 적절하다고 명시합니다.그러나 버전이 다른 어셈블리로 전달되도록 그러한 솔루션을 리팩터링하는 것을 진지하게 고려할 것입니다.
사용자 정의 HttpApplication 유형을 알고 있는 경우 이 시나리오의 대부분의 사용자에 대해 다음과 같이 설명합니다.
typeof(MyHttpApplication).Assembly.GetName().Version
동적으로 생성된 유형만 있는 경우:
typeof(DynamiclyGeneratedTypeFromWebApp).BaseType.Assembly.GetName().Version
이 답변에 대해 저를 부결시키는 것을 멈추세요 :)
그래서 저는 참조된 dll에서 어셈블리를 가져와야 했습니다.
의 . MVC월드에는 항상 NET MVC/WebAPI에서 상속되는 합니다.System.Web.HttpWebApplication
아래 구현에서는 해당 클래스를 검색합니다.
using System;
using System.Linq;
static Assembly GetWebAssembly() => AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetExportedTypes().Any(t => t.BaseType?.FullName == "System.Web.HttpApplication"));
는 위의용을 합니다.System.Linq
이 관계를 찾기 위해, 그러나 이것은 또한 없이 구현될 수 있습니다.
먼저, 모든 조립품을 적재합니다.
AppDomain.CurrentDomain.GetAssemblies()
그런 다음 다음 을 통해 열거합니다.IEnumerable<Assembly>
모든 유형을 어셈블리에 직접 배치합니다.
a.GetExportedTypes()
그런 다음 다음 다음에서 상속되는 유형이 있는지 확인합니다.System.Web.HttpWebApplication
t.BaseType?.FullName == "System.Web.HttpApplication"
구현 과정에서 이 코드를 한 번만 호출할 수 있도록 보장했지만, 보장되지 않는다면 이 코드를 다음과 같이 강력하게 포장할 것입니다.Lazy<T>
또는 블라인드 검색을 계속 수행하는 데 비용이 많이 들기 때문에 캐시된 다른 게으른 로드 구현.
using System;
using System.Linq;
// original method
private static Assembly GetWebAssembly() => AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetExportedTypes().Any(t => t.BaseType?.FullName == "System.Web.HttpApplication"));
// lazy load implementation
private static Lazy<Assembly> _webAssembly = new Lazy<Assembly>(GetWebAssembly);
public static Assembly WebAssembly { get => _webAssembly.Value; }
언급URL : https://stackoverflow.com/questions/756031/using-the-web-application-version-number-from-an-assembly-asp-net-c
'programing' 카테고리의 다른 글
npm ERR!EEXIST 삭제/코드 거부 (0) | 2023.08.15 |
---|---|
표 행에서 slideDown(또는 표시) 기능을 사용하는 방법은 무엇입니까? (0) | 2023.08.15 |
스키마 유효성 검사: 테이블 [게임] 누락 (0) | 2023.08.10 |
Serilog가 MariaDb 데이터베이스에 로깅되지 않음 (0) | 2023.08.10 |
한 문자열에 대한 문자열 목록 (0) | 2023.08.10 |