最近看了一些關於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