1

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

我不拥有程序集 A,但我拥有程序集 B。不幸的是,T 是一个真实类型(不是接口),但幸运的是 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 和/或其他东西?是否可以在我的 dimic 程序集中分配此 GUID 以匹配程序集 A 中的 GUID?

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

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

4

1 回答 1

4

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

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

您可以在此处阅读有关运行时如何定位程序集的更多信息:http: //msdn.microsoft.com/en-us/library/yx7xezcf.aspx

于 2009-04-12T18:20:04.137 回答