C#反射

來源:互聯網
上載者:User

        最近看了一些關於C#反射的知識,估計也就最多達到使用API的程度,至於要深入瞭解,以現在的水平估計很難做到,所以下面此篇文章,以作為一個階段的總結。
       對於反射的總結,我想從以下幾個方面展開,首先是反射程式集,模組,類的成員以及成員的一些資訊;接下來就是動態調用類的成員方法;第三個方面就動態產生程式集,模組和類以及類的成員。好了,現在就讓我們從反射各種資訊開始吧
       在C#中,我們要使用反射,首先要搞清楚以下命名空間中幾個類的關係:
              System.Reflection命名空間
(1)   AppDomain:應用程式定義域,可以將其理解為一組程式集的邏輯容器
(2)   Assembly:程式集類
(3)   Module:模組類
(4)   Type:使用反射得到類型資訊的最核心的類
他們之間是一種從屬關係,也就是說,一個AppDomain可以包含N個Assembly,一個Assembly可以包含N個Module,而一個Module可以包含N個Type.
       AppDomain這個類我們等下再來講解。我們先關注Assembly個類
        在程式中,如果我們要動態載入一個程式集怎麼辦呢?有幾種方式可以使用,分別是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,我們下次會做一些簡單的介紹,同時也希望有軟友能指出文中的錯誤或者遺漏的地方。下回見。

文章出處:http://www.diybl.com/course/1_web/webjs/200877/132108_2.html

文章出處:http://www.diybl.com/course/1_web/webjs/200877/132108.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.