2011-09-18 59 views
12

是否可以从引用的程序集中获取ASP.NET Web应用程序的程序集名称?获取Web应用程序程序集名称,无论当前正在执行的程序集

Assembly.GetEntryAssembly在桌面和控制台应用程序中运行良好,但它似乎在Web应用程序中始终为空,并且GetExecuting \ GetCallingAssebly返回我引用的程序集,而不是Web应用程序中的程序集。


朗解释:

我写了一个定制Settings Provider,即而不是从应用程序配置文件读取配置,它从一个集中的配置服务获取的设置。

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

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

使用提供者的方法是通过.net custom attribute,所以我不能发送任何参数给它。

由于Assembly.Get * Assembly方法看起来不起作用,我能想到的唯一一件事情就是需要appSetting和web应用程序的应用程序名称,但我对此并不满意。任何帮助表示赞赏,谢谢!

回答

16

尝试

BuildManager.GetGlobalAsaxType().BaseType.Assembly 
+3

我得到“在应用程序的预启动初始化阶段不能调用此方法。”尝试在ASP.NET MVC中使用此方法时出错。 – Tomas

+0

这会为我返回“mscorlib”。 – Slavo

+1

如果您的项目中没有包含Global.asax文件,则这不起作用。 – Slavo

8

您可以使用

HttpContext.Current.ApplicationInstance.GetType().Assembly 
+1

它不工作:/ ... ApplicationInstance是在Application_Start(空)方法(其中设置提供初始化),和控制器内部返回一个奇怪的运行时产生的组件(如App_global.asax.hiqe17zm, Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null) – Pablote

+2

@Pabote:尝试获取其BaseType的组合(应在用户代码中定义) – SLaks

+2

如果不包含Global .asax文件在您的项目中。 – Slavo

0

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

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); 
} 
相关问题