繁体   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