動態載入程式集Assembly.Load

來源:互聯網
上載者:User

在C#中,我們要使用反射,主要有三個方面。第一,反射程式集,模組,類的成員以及成員的一些資訊;接下來就是動態調用類的成員方法;第三個方面就動態產生程式集,模組和類以及類的成員。

我們要使用反射,首先要搞清楚以下命名空間中幾個類的關係:

System.Reflection命名空間

AppDomain:應用程式定義域,可以將其理解為一組程式集的邏輯容器

Assembly:程式集類

Module:模組類

Type:使用反射得到類型資訊的最核心的類

他們之間是一種從屬關係,也就是說,一個AppDomain可以包含N個Assembly,一個Assembly可以包含N個Module,而一個Module可以包含N個Type.

在程式中,如果我們要動態載入一個程式集怎麼辦呢?有幾種方式可以使用,分別是Load,LoadFrom和LoadWithPartialName三個Assembly的靜態方法.

先來看Assembly.Load方法,該方法會有多個重載版本,其中一個就是提供者集的詳細資料,即程式集的標識,包括程式集的名稱,版本,地區資訊,公有密鑰標記,全部都是以一個字串的形式提供,例如:"MyAssembly,Version=1.0.0.0,culture=zh-CN,PublicKeyToken=47887f89771bc57f”.

那麼,使用Assembly.Load載入程式集的順序是怎樣的呢?首先它會去全域組件快取尋找,然後到應用程式的根目錄尋找,最後會到應用程式的私人路徑尋找。

當然,如果你使用的是弱命名程式集,也即只給出程式集的名稱,那麼這個時候,CLR將不會在程式集上應用任何安全或者部署策略,而且Load也不會到全域緩衝程式集中尋找程式集。

       測試載入弱命名程式集的例子如下:

(1)   建立一個控制台應用程式的工程,同時勾選建立解決方案

(2)   在解決方案中建立一個類庫的項目,隨便寫一個類和一個方法

(3)   在控制台項目中,首先不添加引用,直接在Main方法中添加如下代碼:

Assembly assembly = Assembly.Load("MyAssembly");

        if (assembly != null)

        {

            Console.WriteLine("載入成功");

         }

執行程式,會拋出異常,說找不到該程式集。什麼原因呢?因為我們使用的是弱命名程式集,Load方法不會去全域組件快取中尋找,而該應用程式目錄下又沒有該程式集,所以程式找不到。這個時候,我們把程式稍微改一下,不用添加代碼,只需添加對MyAssembly的引用,重新運行程式,載入成功了。

      接下來,我們就要看看Load怎麼載入強命名程式集了,這個步驟稍微有些複雜。還是剛才的項目,找到MyAssembly.dll程式集所在的目錄,一般在bin"Debug目錄下

(1)產生金鑰組檔案

sn –k MyAssemblyKey.keys

你也可以自己隨便起一個金鑰組檔案名稱

(2)產生公開金鑰檔案

sn –p MyAssemblyKey.keys MyAssemblyPublicKey.PublicKey

註:查看公開金鑰命令:sn –tp MyAssemblyPublicKey.PublicKey

(3)建立強命名程式集。

很簡單,只需要在聲明命名空間的那句代碼上加上如下特性:

[assembly:AssemblyKeyFileAttribute(@”D:"Test"MyAssemblyKey.keys”)]

(4)   編譯項目

(5)   將程式集添加到程式集全域緩衝

gacutil –i MyAssembly.dll

這個時候,轉到載入程式集的項目中,將Load方法中的參數改為”程式集名,Version=版本,culture=地區資訊,PublicKeyToken=公開金鑰“,然後再去掉對程式集的引用,我們會發現,程式運行成功。表明Load到全域緩衝區尋找到了該程式集。

       使用Load方法載入程式集,特別是強命名程式集,能在程式集上應用安全和部署策略,推薦使用該方法動態載入程式集,至於LoadFrom和LoadWithPartialName。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.