获取Web应用程序程序集名称,而不管当前正在执行的程

时间:2011-09-18 17:56:18

标签: c# .net asp.net asp.net-mvc asp.net-mvc-3

是否可以从引用的程序集中获取ASP.NET Web应用程序的程序集名称?

Assembly.GetEntryAssembly在桌面和控制台应用程序中运行良好,但在Web应用程序中似乎总是为空,而GetExecuting \ GetCalling可能会返回我引用的程序集,而不是Web应用程序中的那个。


冗长的解释:

我编写了一个自定义Settings Provider,它不是从应用配置文件中读取配置,而是从集中配置服务中获取设置。

自定义提供程序位于单独的程序集中,因此可供不同的应用程序使用。

需要使用应用程序程序集名称覆盖ApplicationName属性。

使用提供程序的方法虽然是.net custom attribute,但我无法向其发送任何参数。

由于非Assembly.Get *汇编方法似乎有效,我唯一能想到的就是要求使用app应用程序名称进行appSetting,但我对此并不满意。感谢任何帮助,谢谢!

3 个答案:

答案 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);
}