2011-09-18 86 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); 
} 
相關問題