2011-12-19 79 views
5

我一直在研究一个项目,并且随着它的发展,我意识到两个不能连接在一起的部分是相互依赖的。csc.exe和相互依赖的程序集

我们称这两部分为a.exe和b.dll。 b.dll提供了一个允许a.exe检索数据的实现,但我希望它是它自己的独立程序集,以便它可以很容易地被更改为使a.exe与不同的数据源进行通信。

但是,虽然需要a.exe来引用b.dll,但b.dll需要几个功能,这些功能是a.exe不可分割的一部分。

由于我一直在编译 - 测试 - 因为我一直在编写这个项目,a.exe和b.dll都存在,我可以编译b.dll对a.exe和a.exe反对b.dll,但我/我可以从源码重建这两个?

+0

你怎么没有从Visual Studio得到循环依赖错误? – Oded 2011-12-19 18:39:49

+0

@Oded他正在使用命令行编译 - 您可以迭代地构建它,并创建循环依赖关系 - 但它使得它永远不会执行干净的重建(没有极端困难)。 – 2011-12-19 18:40:52

+0

@ReedCopsey - 我认为他可能会这样做,但希望得到OP的确认。正如你所说,在这种情况下,干净的构建是不可能的。 – Oded 2011-12-19 18:41:40

回答

2

调用CSC.EXE,编译源为A.EXE和B.DLL份进入a.exe,调用csc.exe,co将b.dll的源代码转换为b.dll并引用a.exe,然后再次调用csc.exe,将a.exe的源代码编译为a.exe并引用b.dll。

4

通常,重构这个并将共享依赖关系移动到它们自己的程序集(c.dll)中是一个好主意。这样,a.exe和b.dll都可以引用c.dll,并且您可以避免这种循环依赖。

+0

如果我这样做,但在这种情况下,我只能想象该c.dll将取决于a.exe和b.dll。 该功能与b.dll和a.exe中的代码无法正确分离。 – 2011-12-19 18:56:50

+1

@RobertAllanHenniganLeahy你的目标应该是分开这个。尝试设计您的API,使其解耦。没有理由这些类型应该都是相互依赖的。您可以随时在c.dll中定义a.exe或b.dll实现的接口,以提供功能,或使用委托等。这样的循环依赖关系始终可以解决...... – 2011-12-19 18:58:40

+0

我应该看不到为了避免它们,需要避免相互依赖性,特别是当您建议的方法可能会增加复杂性和大小并潜在地降低性能时。我想通过这个问题一个简单的方法 - 调用csc。将a.exe和b.dll的源码编译为a.exe,调用csc.exe,将b.dll的源代码编译为b.dll并引用a.exe,然后最后一次调用csc.exe,将a.exe的源代码编译为a.exe并引用b.dll。 – 2011-12-19 19:29:51

5

我会重构系统分为三个组件:

  • A.EXE - 主EXE没有什么应该参考这个
  • B.DLL - 正如你今天拥有它,但不A.EXE参考,它引用c.dll
  • c.dll - 此应包含共同个/既a和b需要引用
+0

b.dll只包含一个类 - 让我们将其称为DataSource - 并且a.exe包含一个类库,但是b.dll所需的唯一一个类是称为Server的类,它是a.exe的主要组件。 – 2011-12-19 18:46:01