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