2009-07-21 72 views
10

我有一個文件名,例如我知道位於bin目錄中的庫「Foo.dll」。我想爲它創建一個Assembly對象。我試圖從不是頁面的類實例化這個對象,所以我沒有Request對象來獲取路徑。如何獲得我需要使用Assembly.Load()的路徑?在ASP.NET中從Bin加載程序集

回答

15

Assembly.Load不應該需要文件路徑,而是需要一個AssemblyName。如果您知道程序集位於標準搜索路徑(即bin目錄)中,則不需要知道程序集的磁盤路徑......只需知道其程序集名稱即可。在你的組件的情況下,假設你並不需要一個特定的版本,文化等等,集名稱應該僅僅是「富」:

Assembly fooAssembly = Assembly.Load("Foo"); 

如果您確實需要加載一個特定的版本,你將執行以下操作:

Assembly fooAssembly = Assembly.Load("Foo, Version=1.1.2, Culture=neutral"); 

一般情況下,要使用Assembly.Load,而不是Assembly.LoadFrom或Assembly.LoadFile。 LoadFrom和LoadFile在標準融合過程之外工作,並且可能導致程序集不止一次加載,從不安全位置加載等。Assembly.Load執行「標準」加載,搜索標準彙編位置,例如bin,GAC等等,並應用所有的標準安全檢查。

+2

或者,如果您已經在該程序集中有一個類型的對象 您可以執行如下操作:obj.GetType()。Assembly – 2009-07-22 08:41:17

2

Assembly.LoadFile(...)是否工作?

+0

呃,當然如果你知道絕對路徑。我想這是問題的重要部分。 – 2009-07-22 01:47:43

1

從您的描述中可以看出,這聽起來像是一個Web應用程序,所以除非您在異步線程中產生請求,否則您應該仍然可以訪問HttpContext。從那裏你可以使用Server.MapPath()到你需要的文件。

0

我使用的一個完整示例,如果有幫助的話。資源是DLL庫(議會)的根目錄下的一個文件夾

 public static string ReadAssemblyResourceFile(string resourcefilename) 
     { 
using (var stream = Assembly.Load("GM.B2U.DAL").GetManifestResourceStream("GM.B2U.DAL.Resources." 
    + resourcefilename))   { 
        if (stream == null) throw new MyExceptionDoNotLog($"GM.B2U.DAL.Resources.{resourcefilename} not found in the Assembly GM.B2U.DAL.dll !"); 
        using (var reader = new StreamReader(stream)) 
        { 
         return reader.ReadToEnd(); 
        }   
       } 
     } 

調用的函數:

[TestMethod()] 
public void ReadAssemblyResourceFileTest() 
{ 
    var res = SetupEngine.ReadAssemblyResourceFile("newdb.sql"); 
    Assert.IsNotNull(res); 
} 

PS。不要忘記將「Build Action」標記爲每個資源文件的「Embedded Resource」(在屬性窗口中)。