【问题标题】:How do I build a multiple project solution in Visual Studio without dependencies between the binaries?如何在 Visual Studio 中构建多项目解决方案,而二进制文件之间没有依赖关系?
【发布时间】:2012-11-28 22:01:25
【问题描述】:

我正在使用 Visual Studio 2010 Pro 构建一个包含两个项目的解决方案。项目A包含了我的大部分源代码,而项目B打算独立运行,但必须使用项目A中包含的一些源代码。

在当前配置下,项目 A 包含在项目 B 中作为参考。我希望能够独立构建和维护每个项目的版本,但似乎在构建整个解决方案时,ProjectB.exe如果没有 ProjectA.exe 在同一本地目录中,则无法运行。我认为并希望在编译 .exe 二进制文件时,它们的所有依赖项都打包在每个文件中,但情况似乎并非如此。事实上,任何在 ProjectA.exe 不存在时运行 ProjectB.exe 的尝试都会导致 System.IO.FileNotFoundException。

有没有办法构建一个独立运行并避免代码重复的版本ProjectB.exe?

【问题讨论】:

  • 创建另一个项目(假设是 ProjectC),将其编译为库 (DLL) 并将所有共享代码放在那里。 ProjectA 和 ProjectB 都会引用它(因此您将部署 ProjectA+ProjectC 和 ProjectB+ProjectC)。没有重复。您甚至可以在两个项目之间共享相同的源文件,但嘿……这是一个肮脏无用的“把戏”。
  • 根据您的定义,B 依赖于 A。它必须引用 A,因为 A 是在同一解决方案中编译的,或者是 A.DLL,但不是同一解决方案的一部分解决方案。你到底在问什么?
  • 感谢大家的帮助——尤其是阿德里亚诺。它现在就像一个魅力。

标签: c# visual-studio-2010 .net-4.0


【解决方案1】:

如果您需要通用代码,最好的解决方案是将通用类分解为第三个程序集以用作库。 (根据阿德里亚诺的建议。)他暗示的另一个选项是在将“添加现有文件”用于第二个项目时使用“作为链接”选项。

如果您不知道它在哪里,请使用“添加现有文件”选项,然后在选择文件的对话框中,“添加”按钮有一个下拉选择,您可以在其中选择“作为链接文件”(或类似的东西。)

这允许您将相同的类编译到多个项目中。但请记住,不能为第二个项目更改链接文件的命名空间。如果命名空间是“ProjectA.Domain”,这就是您需要在项目 B 中访问它的方式。这对于在引入多平台程序集之前的 Silverlight 项目来说是一个有用的技巧。

【讨论】:

    【解决方案2】:

    如果你想摆脱对 A 的依赖,你将不得不将通用逻辑提取到另一个项目中(我们称之为 C),正如 Adriano 在评论中建议的那样。

    如果您需要项目之间更松散的联系,您可以不将 A(或 C)作为项目引用,而是作为构建的程序集(.dll 文件)并检查 Specific VersionTrue 的引用属性。此外,如果您的项目/代码库结构更复杂,请查看更多程序集共享选项here

    【讨论】:

    • 您确定嵌入互操作类型会这样做吗?我虽然这仅适用于专门设计的 COM 互操作类型,而不适用于一般程序集。
    • 是的。你可能是对的,完成工作带来的麻烦多于好处。基本上它应该与答案中的第 2 点相同。我会编辑它。
    【解决方案3】:

    一些选项:

    1. 通用选项:将通用代码分离到第三类库 (DLL) 项目中。并让 ProjectA 和 ProjectB 都依赖它。缺点是,现在为了运行项目,您需要两个文件(主 exe 和 dll)。大多数软件都是这样开发的:一个可执行文件和一堆 DLL。
    2. 正确的选择:将公共代码分离到第三个项目中,并修改项目文件以创建包含两个程序集的可执行文件(类似于非托管代码中的静态链接库。)缺点是 Visual Studio 不支持这一点框,您需要修改实际上是 MS-Build 定义文件的项目文件来执行此操作。
    3. 丑陋的选项:在 ProjectB 中为 ProjectA 中的常用文件创建快捷方式。这与将公共代码复制到另一个项目相同,但您仍然只剩下一个源文件。缺点是您必须为每个文件执行此操作,并在两个项目中保持相同的结构。如果可行的话,这是一个丑陋的选择。选择其他之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 2011-09-18
      • 2020-09-08
      • 2011-08-01
      相关资源
      最近更新 更多