C# 是否可以在Visual Studio中的程序集级别启用循环依赖项?甚至可以实现相互依赖的程序集吗?

C# 是否可以在Visual Studio中的程序集级别启用循环依赖项?甚至可以实现相互依赖的程序集吗?,c#,.net,vb.net,visual-studio,circular-dependency,C#,.net,Vb.net,Visual Studio,Circular Dependency,这听起来可能是个愚蠢的问题,但我还是要试一试 所以在VisualStudio中,不能有两个项目X和Y,使得X引用Y和Y引用X 总的来说,我完全可以理解,由于各种原因,循环依赖是如何产生问题的 但是,真的不可能以这种方式编译两个相互依赖的项目吗?在我看来,这一定是可能的,因为(在我看来——也许我对此完全不了解)拥有两个相互依赖的程序集与拥有两个相互依赖的类并没有太大区别——这是一个合法的并且可以编译的案例 如果你说“两个程序集不能相互依赖,因为编译器不能先编译一个,然后再编译另一个”,这对我来说是

这听起来可能是个愚蠢的问题,但我还是要试一试

所以在VisualStudio中,不能有两个项目X和Y,使得X引用Y和Y引用X

总的来说,我完全可以理解,由于各种原因,循环依赖是如何产生问题的

但是,真的不可能以这种方式编译两个相互依赖的项目吗?在我看来,这一定是可能的,因为(在我看来——也许我对此完全不了解)拥有两个相互依赖的程序集与拥有两个相互依赖的类并没有太大区别——这是一个合法的并且可以编译的案例

如果你说“两个程序集不能相互依赖,因为编译器不能先编译一个,然后再编译另一个”,这对我来说是有意义的;除了似乎可以在同一个程序集中为两个类提供相同的参数外,显然编译器可以很好地处理这种情况

基本上,我问这个问题的原因并不是我有一种绝望的愿望去做这件事,我知道这件事通常是不明智的。具体地说,我想知道,如果我能有两个项目——比如说,MyProjectCS和MyProjectVB——它们基本上是作为一个单元的两个相互依赖的部分存在的,并且是分开的,因为某些部分是用C#编写的,而其他部分是用VB.NET编写的

所以,我的问题是(yikes,三重):

  • 是否可以启用此行为(在VisualStudio中或其他地方)
  • 如果在任何IDE中都不可能,那么至少在理论上是可能的,还是相互依赖的程序集不可能存在
  • 如果理论上都不可能,为什么不呢?换句话说,相互依赖的程序集与单个程序集中相互依赖的代码有何不同

  • 我不知道它在VB中是如何工作的,但从理论上讲,应该可以使用某种占位符指向另一个占位符(生成非法代码)来编译其中一个占位符,然后使用它编译另一个占位符,然后重新编译第一个占位符

    例如,在编译相互需要的程序时,循环依赖解析就是这样工作的


    --虽然这通常是通过禁用尚不存在的功能来实现的,但我不知道如何在IDE中实现;但是,可以通过编译的构建过程进行构建

    您将需要:

  • 大会A
  • 大会B
  • 短柱组件B
  • 其中存根程序集B包含程序集B的公共类和公共方法以及相同的AssemblyInfo.*并引用相同的公钥

    建造顺序:

  • 编译存根程序集B
  • 将存根程序集B复制到程序集B的输出目录
  • 生成程序集A
  • 生成程序集B
  • 注意,方法签名中不能有类型的直接循环引用;不过,通过对对象进行强制转换,可以获得有效的循环

    注:

    ilasm可以编译真正的相互递归程序集,因为它可以解析编译时不存在的类型

    进一步:


    aspnet_编译器似乎能够在同一个项目中混合不同的语言(谁知道呢)。

    即使mscorlib.dll和System.dll程序集是相互依赖的,我建议不要让两个程序集相互依赖

    关于类似名称空间的hing之间的依赖循环,我建议使用NDepend来检测和避免

    文章摘录(我写的):

    组件之间的依赖循环导致了通常所说的意大利面代码或纠结代码。如果组件A依赖于B,而组件A依赖于C,组件A不能独立于B和C进行开发和测试。A、B和C形成一个不可分割的单元,一种超级组件。由于规模现象的不经济性,这个超级组件的成本高于a、B和C的成本之和(Steve McConnell的《软件评估:揭开黑色艺术的神秘面纱》中有充分的记录)。基本上,这意味着开发一段不可分割的代码的成本呈指数级增长


    这表明,开发和维护1000 LOC(代码行)的成本可能比开发和维护500 LOC的成本高出三到四倍,除非它可以分为两个独立的块,每个块500 LOC。因此,与意大利面条相比,意大利面条描述了无法维护的复杂代码。为了使架构合理化,必须确保组件之间没有依赖循环,但还要检查每个组件的大小是否可以接受(500到1000 LOC)。

    如果使用命令行工具构建,则可以拥有包含多个模块的程序集。每个模块都可以使用不同的编译器进行编译。模块之间可以有循环依赖关系

    然而,我不希望VisiualStudio支持这一点



    还有一些技巧可以告诉链接器将类型请求从一个程序集重定向到另一个程序集。Microsoft使用这些类型,然后在.net framework中移动类型。只有在无法让所有调用者重新编译代码时,这才有价值。

    如果使用条件编译,Visual Studio中可能存在循环依赖项。大多数情况下,最好从一开始就删除循环引用,但如果您有充分的理由保留循环引用,则可以将其用作构建循环引用的变通方法。

    我一直都会遇到这种情况。。。我的Egg项目抛出“Chicken.dll not found…”,而我的Chicken项目抛出类似的错误。NET framework在内部使用相互依赖的程序集。有人在拆散后发现了