C# 两个项目的参考资料

C# 两个项目的参考资料,c#,visual-studio,reference,project-reference,C#,Visual Studio,Reference,Project Reference,我有两个项目,分别是P1和P2 P1具有P2的参考 因此,我可以从P1访问P2的方法。但是如果我想从P2访问P1的方法,那么我如何访问它们呢 我知道我不能在P2中添加P1的引用 如果可能的话?如果是的话,怎么办 简短回答:无法在P2项目中添加P1作为引用,因为这将创建不允许的循环依赖关系。考虑重构代码并以不同的方式设计应用程序。一种方法是引入另一个包含对这两个项目的引用的项目。您不能从P2引用P1,因为它会创建循环依赖关系。循环依赖性指向糟糕的设计。有很多方法可以解决这个问题,例如,您可以将共享

我有两个项目,分别是
P1
P2

P1具有P2的参考

因此,我可以从
P1
访问
P2的方法。但是如果我想从
P2
访问
P1的方法,那么我如何访问它们呢

我知道我不能在
P2
中添加
P1的
引用


如果可能的话?如果是的话,怎么办

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

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

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

现在,解决方案是:

  • 简单的解决方法是:创建一个共享库,在其中输入P1和P2的共享代码。P1和P2都可以引用此共享项目

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


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

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

我不得不使用一个长期运行的WinForms应用程序来实现这一点,该应用程序最初是用VB编写的,但几年后就转到了C#。所有新的Windows窗体都是用C#编写的,这与VB窗体不可能是同一个项目,但有些VB窗体需要调用新的C#窗体,反之亦然

编辑1


这样做的一个缺点是,如果P2引用P1作为其项目输出DLL/EXE,然后在清理/重新生成解决方案时出现错误,则输出DLL/EXE将不再存在,并且在解决错误之前无法重新创建,但由于缺少引用,无法再生成解决方案。这不是一个好地方,所以一定要不时保留一份输出DLL/EXE的副本,这样一旦发生这种情况,你就可以从中解脱出来。

ohh。。我肯定会尝试这种方法,将两个程序集双向链接在一起,这样两个程序集就不会彼此不工作(失去代码的可重用性),但如果您想共享日志记录(和状态信息的显示)之类的内容,另一种方法是复制逻辑(违反DRY)在应用程序和DLL之间。从概念上讲,例如,一个dll不应该依赖于使用它的应用程序,但另一方面,有两个单独的日志文件使得“在应用程序中执行X导致Y在dll中发生”这一点不那么清楚。。。。在我所看到的C/C++代码中,这种链接是无法避免的,这并不少见,这可能只是取决于为什么您首先创建了一个单独的DLL,IIRC Quake 3做了类似的事情来在它的引擎组件。@jrh-我同意,但就我而言,我们决定在大约8年后改变语言。这两个项目在逻辑上都是一个单独的项目,但由于我不能在同一个项目中使用c#和vb,这是一个解决办法。@JonRoberts对,我主要决定发表评论,因为我可以想到需要循环引用的情况,并且我不认为每个程序集都必须像可重用的库dll一样工作。我认为“共享代码”的答案做出了很多假设,我可以想到相互依赖的不可重用DLL的有效用途;对于您真正需要的情况,您可以重构到最后,但问题只会转移到其他地方。