8

我有两个项目说P1P2

P1 具有P2的参考

所以我可以P2's methodsP1. 但是,如果我想从那时开始访问P1's methodsP2我该如何访问它们呢?

我知道我不能P1'sP2?

如果有可能?如果是,那么如何?

4

4 回答 4

19

正如其他人指出的那样,循环引用是问题所在。它在编译 P1 之前无法编译 P2,但是如果 P1 依赖于 P2,它在 P2 编译之前无法编译 P1... 有问题吗?

现在解决方案:

  • 简单的出路:创建一个共享库,在其中放入 P1 和 P2 的共享代码。P1 和 P2 都可以引用此共享项目。

  • 更好的解决方案:创建一个您在共享库中定义的接口。将 P1 中 P2 的“引用”基于共享接口,而不是基于实际实现。这样,您就有了更好的可测试解决方案,并且更容易替换部分代码。

于 2015-12-10T12:53:03.107 回答
3

实现此目的的另一种方法是将 P1 引用 P2 作为解决方案中的项目,但仅通过其输出 DLL 或 EXE 使 P2 引用 P1。

您丢失了一些跨项目/依赖项检查,但它确实允许您交叉引用。

我必须使用一个长期运行的 WinForms 应用程序来完成这项工作,该应用程序最初是用 VB 编写的,但几年后转移到了 C#。所有新的 Windows 窗体都是用 C# 编写的,这与 VB 窗体不能是同一个项目,但某些 VB 窗体需要调用新的 C# 窗体,反之亦然。

编辑 1

这样做的一个缺点是,如果 P2 引用 P1 作为它的项目输出 DLL/EXE,然后,当您清理/重建解决方案时,会出现错误,您处于输出 DLL/EXE 不再存在并且可以的位置在解决错误之前不会重新创建,但由于缺少引用,因此无法再构建解决方案。这不是一个好地方,因此请确保不时保留输出 DLL/EXE 的副本,以便在发生这种情况时摆脱困境。

于 2017-11-14T14:31:49.977 回答
2

简短的回答:没有办法在 P2 项目中添加 P1 作为引用,因为这将创建一个不允许的循环依赖。考虑以不同的方式重构您的代码和设计应用程序。一种方法是引入另一个包含对这两个项目的引用的项目。

于 2015-12-10T12:51:03.243 回答
1

您不能从 P2 引用 P1,因为它会创建循环依赖。循环依赖指向糟糕的设计。有一些方法可以解决这个问题,例如您可以将共享代码重构到另一个项目中。

于 2015-12-10T12:51:16.240 回答