2009-04-12 74 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

相关问题