我有两个项目说P1
和P2
。
P1 具有P2的参考。
所以我可以P2's methods
从P1
. 但是,如果我想从那时开始访问P1's methods
,P2
我该如何访问它们呢?
我知道我不能
P1's
在P2
?
如果有可能?如果是,那么如何?
我有两个项目说P1
和P2
。
P1 具有P2的参考。
所以我可以P2's methods
从P1
. 但是,如果我想从那时开始访问P1's methods
,P2
我该如何访问它们呢?
我知道我不能
P1's
在P2
?
如果有可能?如果是,那么如何?
正如其他人指出的那样,循环引用是问题所在。它在编译 P1 之前无法编译 P2,但是如果 P1 依赖于 P2,它在 P2 编译之前无法编译 P1... 有问题吗?
现在解决方案:
简单的出路:创建一个共享库,在其中放入 P1 和 P2 的共享代码。P1 和 P2 都可以引用此共享项目。
更好的解决方案:创建一个您在共享库中定义的接口。将 P1 中 P2 的“引用”基于共享接口,而不是基于实际实现。这样,您就有了更好的可测试解决方案,并且更容易替换部分代码。
实现此目的的另一种方法是将 P1 引用 P2 作为解决方案中的项目,但仅通过其输出 DLL 或 EXE 使 P2 引用 P1。
您丢失了一些跨项目/依赖项检查,但它确实允许您交叉引用。
我必须使用一个长期运行的 WinForms 应用程序来完成这项工作,该应用程序最初是用 VB 编写的,但几年后转移到了 C#。所有新的 Windows 窗体都是用 C# 编写的,这与 VB 窗体不能是同一个项目,但某些 VB 窗体需要调用新的 C# 窗体,反之亦然。
编辑 1
这样做的一个缺点是,如果 P2 引用 P1 作为它的项目输出 DLL/EXE,然后,当您清理/重建解决方案时,会出现错误,您处于输出 DLL/EXE 不再存在并且可以的位置在解决错误之前不会重新创建,但由于缺少引用,因此无法再构建解决方案。这不是一个好地方,因此请确保不时保留输出 DLL/EXE 的副本,以便在发生这种情况时摆脱困境。
简短的回答:没有办法在 P2 项目中添加 P1 作为引用,因为这将创建一个不允许的循环依赖。考虑以不同的方式重构您的代码和设计应用程序。一种方法是引入另一个包含对这两个项目的引用的项目。
您不能从 P2 引用 P1,因为它会创建循环依赖。循环依赖指向糟糕的设计。有一些方法可以解决这个问题,例如您可以将共享代码重构到另一个项目中。