2013-09-16 39 views
1

我想從該應用程序引用的任何代碼動態獲取當前正在執行的Web應用程序的程序集,並在相同的AppDomain中執行。如何在沒有Global.asax的ASP.NET中獲得Web應用程序程序集?

我想這個問題是問什麼:Get web application assembly name, regardless of current executing assembly

然而,在這個問題的所有答覆使用Global.asax文件,以獲取Web應用程序組件。如果應用程序沒有global.asax文件,則這不起作用,因爲在這種情況下,返回的類型是HttpApplication,它位於System.Web程序集中。

我想過的一種方式是通過某種方式過濾當前AppDomain中的程序集,但我不知道這可能是什麼。 Web應用程序和另一個正常的DLL的程序集是否有區別?我知道Visual Studio中的項目有一個GUID來表示項目類型(ASP.NET Web App,類庫,MVC應用程序等)。此信息以某種方式呈現在已編譯的程序集中?

另一種方法是使用System.Web.Hosting名稱空間中的ApplicationHost,但該名稱空間只有靜態數據,沒有任何關於程序集的信息。

第三種方法是在Web應用程序項目中包含一個類型並使用該類型,但爲此,需要獲取Web程序集名稱的代碼需要對該類型的引用(並且這將是循環引用)。

任何想法?

回答

1

作爲一個非常醜陋的黑客攻擊,你會發現在應用程序的ASPX文件,然後讓組裝包含其編譯類型:

var filePath = Directory.EnumerateFiles(HttpRuntime.AppDomainAppPath, "*.aspx") 
         .FirstOrDefault(); 
var assembly = BuildManger.GetCompiledType(filePath).Assembly; 

如果沒有任何ASPX文件,你可以嘗試ASHX或ASMX或CSHTML。

這對於網站項目無法正常工作,其中每個文件都有自己的程序集。

+0

這會引發異常,因爲ASPX文件的路徑是相對的,而且它期望虛擬。當我將其更改爲'HttpRuntime.AppDomainAppVirtualPath'時,返回的路徑爲'null' – Slavo

+0

我用'BuildManager.GetCompiledType(「〜/ Default.aspx」)。Assembly替換了您的建議,但它返回一個新程序集。 GetCompiledType()編譯您按需傳遞給它的內容,併爲它創建一個新的臨時程序集,因此它不使用Web應用程序程序集。 – Slavo

+0

@Slavo:嗯......它是什麼樣的應用程序?我試圖弄清楚如何從中得到一個類型。 – SLaks

相關問題