2009-04-12 80 views
1

我有一個裝配在裝配B.取決於(靜態)在T型(引用類型,一類).NET運行時如何確定兩種類型相同?

我沒有自己組裝A,但我做自己的組裝B.將T不幸的是,一個真正的類型(不一個界面),但幸運的是A使用反射來發現它的成員。

我想能夠動態地創建B(和T)。唯一重要的事情是我需要確保動態創建的「B和T」(不是它們的成員)與編譯A時靜態編譯的那些「等效」。

  1. 我可以使用反射發射來創建B和T.沒問題。
  2. 我可以寫B.DLL磁盤
  3. 如果A被編譯針對此B.DLL然後我可以動態地改變T,沒有問題
  4. 然而,如果A被針對等效編譯的(手寫B和T)那麼A中的T'將具有相同的程序集名稱和類型名稱,但它不會被視爲與動態創建的那個相同。

我假設原因是類型上的GUID屬性。當我將B.dll寫入磁盤時,T類型與我可以動態創建的GUID相同(即使我更改其成員)。然而,「另外等價的」手寫類型不共享相同的GUID。

總之,如果dll來自動態創建但與靜態創建的不同,GUID是相同的。 GUID每次都是一樣的(即使我重新編譯)。如果我更改動態類型的內容,GUID是相同的。

運行時如何確定兩種類型是否相同?這個GUID是如何創建的?它使用這個GUID和/或其他東西?是否可以在我的dimamic組件中分配此GUID以匹配組件A中的GUID?

可以靜態檢查此GUID(我無法用Reflector或ildasm查看它)。

注意:假設程序集未簽名。

回答

4

.NET運行時使用程序集名稱,版本,強名稱(如果存在),並且在某些情況下使用文化來查找引用的程序集。如果裝配體A引用另一個裝配體B,則可以用另一個裝配體替換B,前提是所提到的屬性完全相同。如果B擁有強名稱,則只有擁有用於簽署程序集的密鑰文件時,才能創建具有相同強名稱的另一個程序集。

AFAIK,Type.GUID屬性僅在您的類型註冊爲COM使用時使用。它適用於GuidAttribute類。因此,Type.GUID與類型的「身份」無關。

你可以閱讀更多有關運行庫如何就位於此組件:http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

相關問題