是否可以从引用的程序集中获取ASP.NET Web应用程序的程序集名称?
Assembly.GetEntryAssembly在桌面和控制台应用程序中运行良好,但在Web应用程序中似乎总是为空,而GetExecuting \ GetCalling可能会返回我引用的程序集,而不是Web应用程序中的那个。
冗长的解释:
我编写了一个自定义Settings Provider,它不是从应用配置文件中读取配置,而是从集中配置服务中获取设置。
自定义提供程序位于单独的程序集中,因此可供不同的应用程序使用。
需要使用应用程序程序集名称覆盖ApplicationName属性。
使用提供程序的方法虽然是.net custom attribute,但我无法向其发送任何参数。
由于非Assembly.Get *汇编方法似乎有效,我唯一能想到的就是要求使用app应用程序名称进行appSetting,但我对此并不满意。感谢任何帮助,谢谢!
答案 0 :(得分:18)
尝试
BuildManager.GetGlobalAsaxType().BaseType.Assembly
答案 1 :(得分:9)
您可以使用
HttpContext.Current.ApplicationInstance.GetType().Assembly
答案 2 :(得分:1)
我知道这是一个老问题,但这是我对某种类似情况的处理方法。在我的情况下,我正在使用另一个程序集来格式化字符串,并显示具有相同核心的多个程序的版本。
Version v = null;
var a = Assembly.GetEntryAssembly() ?? GetWebEntryAssembly() ?? Assembly.GetExecutingAssembly();
SnapshotVersion = FileVersionInfo.GetVersionInfo(a.Location).ProductVersion;
if (ApplicationDeployment.IsNetworkDeployed)
{
var d = ApplicationDeployment.CurrentDeployment;
v = d.CurrentVersion;
v = new Version(v.Major, v.Minor, v.Revision);
}
else
v = a.GetName().Version;
if (v != null)
version = string.Format("{0}.{1}.{2}", v.Major, v.Minor, v.Build);
因为这是在静态构造函数中,所以我需要做的就是从Web应用程序调用此静态类的任何属性,然后找到与静态类所在的程序集不同的最后一个调用程序集。这是通过GetWebEntryAssembly方法实现的。
private static Assembly GetWebEntryAssembly()
{
var frames = new StackTrace().GetFrames();
var i = frames.FirstOrDefault(c => Assembly.GetAssembly(c.GetMethod().DeclaringType).FullName != Assembly.GetExecutingAssembly().FullName).GetMethod().DeclaringType;
return Assembly.GetAssembly(i);
}