我有程序集 A,它(静态地)依赖于程序集 B 中的类型 T(引用类型,一个类)。
我不拥有程序集 A,但我拥有程序集 B。不幸的是,T 是一个真实类型(不是接口),但幸运的是 A 使用反射来发现它的成员。
我希望能够动态创建 B(和 T)。唯一重要的一点是,我需要确保动态创建的“B 和 T”(不是它们的成员)与编译 A 时静态编译的那些“等效”。
- 我可以使用反射 Emit 来创建 B 和 T。没问题。
- 我可以将 B.dll 写入磁盘
- 如果 A 是针对这个 B.dll 编译的,那么我可以动态更改 T,没问题
- 但是,如果 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 看到它)。
注意:假设程序集未签名。