获取Web应用程序程序集名称,无论当前执行的程序集是什么

20

如何从一个已引用的程序集中获取ASP.NET Web应用程序的程序集名称?

在桌面和控制台应用程序中,Assembly.GetEntryAssembly 可以正常工作,但在 Web 应用程序中似乎始终为 null,而 GetExecuting\GetCallingAssebly 返回的是被引用的程序集,而不是 Web 应用程序的程序集。


详细说明:

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

这个自定义提供程序是在单独的程序集中,以便可以被不同的应用程序使用。

ApplicationName 属性需要重写为应用程序的程序集名称。

要使用该提供程序,需要通过.NET 自定义属性,因此无法向其发送任何参数。

由于 Assembly.Get*Assembly 方法似乎都无法正常工作,因此我唯一能想到的是对 web 应用程序使用 app 名称的 appSetting 进行要求,但我对此并不满意。如果对此有任何帮助,将不胜感激,谢谢!

3个回答

20
尝试
BuildManager.GetGlobalAsaxType().BaseType.Assembly

4
在尝试在ASP.NET MVC中使用此方法时,我遇到了“无法在应用程序的预启动初始化阶段调用此方法”的错误。 - Tomas
1
这对我返回“mscorlib”。 - Slavo
1
如果您的项目中没有包含 Global.asax 文件,这将无法正常工作。 - Slavo

10

你可以使用

HttpContext.Current.ApplicationInstance.GetType().Assembly

2
不起作用 :/ ... 在 Application_Start() 方法中 (初始化设置提供程序的位置),ApplicationInstance 为空,在控制器内返回一个奇怪的运行时生成的程序集 (例如 App_global.asax.hiqe17zm,Version=0.0.0.0, Culture=neutral, PublicKeyToken=null) - Pablote
2
@Pabote:尝试获取其“BaseType”的汇编(应该在用户代码中定义)。 - SLaks
3
如果项目中没有包含 Global.asax 文件,这个方法将无法生效。 - Slavo

3

我知道这是一个老问题,但这是我对类似情况的处理方法。在我的情况下,我使用另一个程序集来格式化一个字符串,以显示具有相同核心的多个程序的版本。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接