首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Microsoft如何创建具有循环引用的程序集?

Microsoft如何创建具有循环引用的程序集?
EN

Stack Overflow用户
提问于 2009-08-22 17:26:07
回答 9查看 11.2K关注 0票数 109

在.NET BCL中,以下对象之间存在循环引用:

  • System.dllSystem.Xml.dll
  • System.dll以及System.Configuration.dll
  • System.Xml.dllSystem.Configuration.dll

这是一个来自.NET反射器的屏幕截图,它显示了我的意思:

微软是如何创建这些程序集的对我来说是个谜。是否需要特殊的编译过程才能实现这一点?我想这里一定发生了一些有趣的事情。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-08-22 17:43:49

我只能告诉你Mono Project是如何做到这一点的。这个定理非常简单,尽管它给出了一个混乱的代码。

它们首先编译System.Configuration.dll,而不需要引用System.Xml.dll。在此之后,他们以正常的方式编译System.Xml.dll。现在魔术来了。它们重新编译需要引用System.Xml.dll的部分的System.configuration.dll。现在有一个循环引用的成功编译。

简而言之:

编译

  • A而不需要B的代码和对B的引用。编译
  • B。重新编译
  • A。
票数 58
EN

Stack Overflow用户

发布于 2009-08-22 17:58:06

RBarryYoung和Dykam发现了点什么Microsoft使用内部工具,该工具使用ILDASM来反汇编程序集,剥离所有内部/私有内容和方法体,并重新编译IL (使用ILASM)为所谓的“脱水程序集”或元数据程序集。每次更改程序集的公共接口时,都会执行此操作。

在生成过程中,将使用元数据程序集而不是实际程序集。这样循环就被打破了。

票数 35
EN

Stack Overflow用户

发布于 2009-08-22 17:50:47

它可以按照Dykam描述的方式来完成,但是Visual Studio会阻止你这样做。

您必须直接使用命令行编译器csc.exe。

/reference:ClassA.dll

  • csc /reference:ClassB.dll

  1. csc /target:library ClassA.cs
  2. csc /target:library ClassB.cs /target:library ClassA.cs ClassC.cs csc

代码语言:javascript
复制
//ClassA.cs
namespace CircularA {
    public class ClassA {
    }
}


//ClassB.cs
using CircularA;
namespace CircularB {
    public class ClassB : ClassA  {
    }
}


//ClassC.cs
namespace CircularA {
    class ClassC : ClassB {
    }
}
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1316518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档