【问题标题】:Reference in two projects两个项目中的参考
【发布时间】:2016-03-16 02:43:45
【问题描述】:

我有两个项目,分别是 P1P2

P1 有 P2 的引用

所以我可以从P1 访问P2's methods。但是如果我想从P2 访问P1's methods 怎么办?那么我该如何访问它们呢?

我知道我不能在P2 中添加P1's 引用?

如果有可能?如果是,那么如何?

【问题讨论】:

    标签: c# visual-studio reference project-reference


    【解决方案1】:

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

    现在的解决方案:

    • 简单的出路:创建一个共享库,在其中放入 P1 和 P2 的共享代码。 P1 和 P2 都可以引用此共享项目。

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

    【讨论】:

      【解决方案2】:

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

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

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

      编辑 1

      这样做的一个缺点是,如果 P2 引用 P1 作为它的项目输出 DLL/EXE,然后,当您清理/重建解决方案时,会出现错误,您处于输出 DLL/EXE 不再存在的位置并且在解决错误之前无法重新创建,但由于缺少参考,因此无法再构建解决方案。这不是个好地方,因此请确保不时保留一份输出 DLL/EXE 的副本,以便在发生这种情况时摆脱困境。

      【讨论】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多