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

Dre*_*kes 105 .net assemblies circular-reference base-class-library

在.NET BCL中有以下循环引用:

  • System.dll 和 System.Xml.dll
  • System.dll 和 System.Configuration.dll
  • System.Xml.dll 和 System.Configuration.dll

这是.NET Reflector的截图,显示了我的意思:

在此输入图像描述

微软如何创建这些程序集对我来说是一个谜.是否需要特殊的编译过程才允许这样做?我想象这里有一些有趣的东西.

Dyk*_*kam 57

我只能告诉Mono Project如何做到这一点.这个定理很简单,虽然它会给代码带来麻烦.

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

简而言之:

  • 编译A时没有代码需要B和B的引用.
  • B编译.
  • A被重新编译.

  • 我知道.Mono的主要构建系统不是Visual Studio.猜猜微软也不是. (14认同)

Srd*_*cic 35

RBarryYoung和Dykam正在做点什么.Microsoft使用内部工具使用ILDASM来反汇编程序集,删除所有内部/私有内容和方法主体,并再次将IL重新编译(使用ILASM)到所谓的"脱水程序集"或元数据程序集中.每次更改装配的公共接口时都会执行此操作.

在构建期间,使用元数据程序集而不是实际程序集.这样循环就被打破了.


Alf*_*ers 26

它可以按照Dykam描述的方式完成,但Visual Studio会阻止您这样做.

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

  1. csc/target:库ClassA.cs

  2. csc/target:library ClassB.cs /reference:ClassA.dll

  3. csc/target:library ClassA.cs ClassC.cs /reference:ClassB.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 {
    }
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*esH 17

只要你不使用项目引用,它在Visual Studio中就很容易了...试试这个:

  1. 打开视觉工作室
  2. 创建2个类库项目"ClassLibrary1"和"ClassLibrary2".
  3. 建立
  4. 从ClassLibrary1通过浏览到步骤3中创建的dll添加对ClassLibrary2的引用.
  5. 从ClassLibrary2通过浏览到步骤3中创建的dll添加对ClassLibrary1的引用.
  6. 再次构建(注意:如果您在两个项目中进行更改,则需要构建两次以使两个引用都"新鲜")

所以你就是这样做的.但是说真的......难道你不是在真正的项目中做到这一点!如果你这样做,圣诞老人今年不会带给你任何礼物.

  • 唯一的例外是在 12 月 26 日至 31 日之间并且礼物已获得 (3认同)

Ste*_*ham 6

我想这可以通过从一组非循环程序集开始并使用ILMerge然后将较小的程序集合并到逻辑相关的组中来完成.