两个项目中的参考
本文关键字:参考 项目 两个 | 更新日期: 2023-09-27 18:26:26
我有两个项目,即P1
和P2
。
P1具有P2的引用。
所以我可以从CCD_ 4访问CCD_。但是,如果我想从P2
访问P1's methods
,我该如何访问它们呢?
我知道我不能在
P2
中添加P1's
引用?
如果可能的话?如果是,那么怎么做?
正如其他人指出的那样,循环引用是个问题。在编译P1之前,它不能编译P2,但如果P1依赖于P2,那么在P2编译之前,它就不能编译P1。。。有问题吗?
现在的解决方案:
-
简单的方法是:创建一个共享库,在其中放入P1和P2的共享代码。P1和P2都可以引用此共享项目。
-
更好的解决方案是:创建一个在共享库中定义的接口。将P2在P1中的"引用"建立在共享接口上,而不是实际实现上。这样,您就有了一个更好的可测试解决方案,并且可以更容易地替换部分代码。
简单回答:没有办法在P2项目中添加P1作为引用,因为这将创建一个不允许的循环依赖关系。考虑重构代码并以不同的方式设计应用程序。一种方法是引入另一个包含对这两个项目的引用的项目。
实现这一点的另一种方法是将P1引用P2作为解决方案中的项目,但P2仅通过其输出DLL或EXE引用P1。
您失去了一些跨项目/依赖项检查,但它确实允许您进行交叉引用。
我不得不使用一个长期运行的WinForms应用程序来完成这项工作,该应用程序最初是用VB编写的,但几年后转到了C#。所有新的Windows窗体都是用C#编写的,这不可能是与VB窗体相同的项目,但一些VB窗体需要调用新的C#窗体,反之亦然。
编辑1
这样做的一个缺点是,如果P2引用P1作为其项目输出DLL/EXE,然后在清理/重建解决方案时出现错误,则表明输出DLL/XE已不存在,在解决错误之前无法重新创建,但解决方案无法再构建,因为它缺少引用。这不是一个好地方,所以一定要不时地保存一份输出DLL/EXE的副本,这样你就可以在发生这种情况时摆脱它。
不能从P2引用P1,因为它会创建循环依赖关系。循环依赖关系指向糟糕的设计。有很多方法可以解决这个问题,例如,您可以将共享代码重构到另一个项目中。