.NET运行时如何确定两种类型是否相同?

时间:2009-04-12 16:54:18

标签: .net reflection types reflection.emit .net-internals

我有程序集A,它(静态地)依赖于程序集B中的类型T(引用类型,类)。

我不拥有程序集A但我拥有程序集B.不幸的是,它是一个真正的类型(不是接口)但幸运的是A使用反射来发现它的成员。

我希望能够动态创建B(和T)。唯一重要的项目是我需要确保动态创建的“B和T”(不是它们的成员)与编译A时静态编译的那些“等同”。

  1. 我可以使用反射Emit创建B和T.没问题。
  2. 我可以将B.dll写入磁盘
  3. 如果针对此B.dll编译了A,那么我可以动态更改T,没问题
  4. 但是,如果A是针对等价物(手写的B和T)编译的,那么A中的T'将具有相同的程序集名称和类型名称,但不会被视为等于动态创建的那个。
  5. 我认为原因是该类型的GUID属性。当我将B.dll写入磁盘时,T类型具有与我可以动态创建的GUID相同的GUID(即使我更改其成员)。但是,“其他等效”手写类型不共享相同的GUID。

    总之,如果dll来自动态创建的GUID,则GUID是相同的,但与静态创建的不同。每次GUID都是一样的(即使我重新编译)。如果我更改动态类型的内容,GUID是相同的。

    运行时如何确定两种类型是否相同?这个GUID是如何创建的?它使用这个GUID和/或其他东西?是否可以在我的dimamic程序集中分配此GUID以匹配程序集A中的GUID

    可以静态检查此GUID(我无法使用Reflector或ildasm查看它)。

    注意:假设程序集未签名。

1 个答案:

答案 0 :(得分:4)

.NET运行时使用程序集名称,版本,强名称(如果存在),在某些情况下使用文化来查找引用的程序集。如果组件A引用另一个组件B,则如果提到的属性完全相同,则可以用另一个组件替换B.如果B具有强名称,则只有拥有用于对程序集签名的密钥文件才能创建具有相同强名称的另一个程序集。

AFAIK,Type.GUID属性仅在您的类型注册用于COM时使用。它适用于GuidAttribute类。因此,Type.GUID与类型的“身份”无关。

您可以在此处详细了解运行时如何查找程序集:http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx