簡體   English   中英

.NET運行時如何確定兩種類型是否相同?

[英]How does the .NET runtime determine that two types are the same?

我有程序集A,它(靜態地)依賴於程序集B中的類型T(引用類型,類)。

我不擁有程序集A但我擁有程序集B.不幸的是,它是一個真正的類型(不是接口)但幸運的是A使用反射來發現它的成員。

我希望能夠動態創建B(和T)。 唯一重要的項目是我需要確保動態創建的“B和T”(不是它們的成員)與編譯A時靜態編譯的那些“等同”。

  1. 我可以使用反射Emit來創建B和T.沒問題。
  2. 我可以把B.dll寫到磁盤上
  3. 如果A是針對這個B.dll編譯的,那么我可以動態地改變T,沒問題
  4. 但是,如果A是針對等價物(手寫的B和T)編譯的,則A中的T'將具有相同的程序集名稱和類型名稱,但不會被視為等於動態創建的那個。

我假設原因是該類型的GUID屬性。 當我將B.dll寫入磁盤時,T類型具有與我可以動態創建的GUID相同的GUID(即使我更改其成員)。 但是,“其他等效”手寫類型不共享相同的GUID。

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

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

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

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

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

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

您可以在此處詳細了解運行時如何查找程序集: http//msdn.microsoft.com/en-us/library/yx7xezcf.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM