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