在.NET BCL中,以下对象之间存在循环引用:
System.dll
和System.Xml.dll
System.dll
以及System.Configuration.dll
System.Xml.dll
和System.Configuration.dll
这是一个来自.NET反射器的屏幕截图,它显示了我的意思:
微软是如何创建这些程序集的对我来说是个谜。是否需要特殊的编译过程才能实现这一点?我想这里一定发生了一些有趣的事情。
发布于 2009-08-22 17:43:49
我只能告诉你Mono Project是如何做到这一点的。这个定理非常简单,尽管它给出了一个混乱的代码。
它们首先编译System.Configuration.dll,而不需要引用System.Xml.dll。在此之后,他们以正常的方式编译System.Xml.dll。现在魔术来了。它们重新编译需要引用System.Xml.dll的部分的System.configuration.dll。现在有一个循环引用的成功编译。
简而言之:
编译
发布于 2009-08-22 17:58:06
RBarryYoung和Dykam发现了点什么Microsoft使用内部工具,该工具使用ILDASM来反汇编程序集,剥离所有内部/私有内容和方法体,并重新编译IL (使用ILASM)为所谓的“脱水程序集”或元数据程序集。每次更改程序集的公共接口时,都会执行此操作。
在生成过程中,将使用元数据程序集而不是实际程序集。这样循环就被打破了。
发布于 2009-08-22 17:50:47
它可以按照Dykam描述的方式来完成,但是Visual Studio会阻止你这样做。
您必须直接使用命令行编译器csc.exe。
/reference:ClassA.dll
//ClassA.cs
namespace CircularA {
public class ClassA {
}
}
//ClassB.cs
using CircularA;
namespace CircularB {
public class ClassB : ClassA {
}
}
//ClassC.cs
namespace CircularA {
class ClassC : ClassB {
}
}
https://stackoverflow.com/questions/1316518
复制相似问题