从两个被排除的库中引用的VS项目

本文关键字:引用 项目 VS 排除 两个 | 更新日期: 2023-09-27 18:01:29

应用程序有两个版本。第一个使用LIB_A库的引用,第二个使用LIB_B库的引用。(LIB_A和LIB_B实际上是同一产品的两个版本,但它们彼此不同,甚至命名空间也不同。不能在同一台机器上同时安装两个版本)。我的应用程序的源代码在两个版本几乎是相同的,所以我需要有一个解决方案,可以切换哪个库使用。我该怎么做呢?

从两个被排除的库中引用的VS项目

既然你在评论中指定了VS2010,我单独添加了这个答案,以便VS2015的用户可以参考另一个答案,这更干净。

在VS2010中,您可以在两个项目之间使用源代码共享。假设您已经创建了AppA,它是引用LibA的应用程序项目,并包含应用程序的所有源代码。

你可以创建一个应用项目AppB,它引用LibB。它还共享所有AppA来源。这可以通过以下两种方式之一来完成:

手动链接所有源

在AppB中,您可以创建与AppA相同的文件夹结构(如果有的话)。右键单击每个子文件夹,然后单击"添加->现有项目…"导航到AppA对应的文件夹,选择所有c#文件。现在点击添加按钮右侧的下拉菜单,选择"添加为链接"。您会注意到,添加的源在其图标中有一个小的"共享"箭头,并且它们的路径指向原始源。

动态链接所有源

如果您在AppA中有很多文件,或者定期添加/删除文件,那么前面的方法可能会很累人。还有另一种方法需要手工编辑AppB.csproj。AppB开放。并创建一个从AppA导入所有文件的ItemGroup。这段代码假设AppA和AppB是解决方案文件夹的子文件夹。如果没有,请修改相应的相对路径。

  <ItemGroup>
    <Compile Include="..'AppA''**'*.cs">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
    </Compile>
  </ItemGroup>

现在当您打开解决方案时,您将看到AppB的内容与AppA的内容匹配。源代码是链接的,所以AppB的条件构建设置(如果有的话)将被应用。

您还可以通过向Compile标记添加Exclude属性来排除文件。查看VS文档了解更多细节。

这种方法的唯一缺点是需要手工编辑csproj文件。此外,如果您不小心删除或移动链接文件,VS将硬编码链接文件列表到项目中。文件本身仍将被链接。

刚好Visual Studio 2015(你可以下载Release Candidate,我发现它比VS2013更强大更快)有一个专门为这个目的设计的功能——共享项目。这是第9频道的一个视频。

共享项目包含直接编译成引用它的项目的源文件。假设一个共享项目shared有一个文件foo.cs,项目AppA和AppB都引用了项目shared,那么文件foo.cs被直接编译为AppA和AppB——它使用这些项目的任何条件设置。foo。cs的代码可以像这样

#if APPA
// do something
#elif APPB
// do something else
#endif

总结一下:

  1. 在一个单一的解决方案中,创建一个共享项目与所有的应用程序源。
  2. 创建两个项目apppa和AppB,代表你的应用程序的两种风格。
  3. AppA引用了Shared和Lib_A。AppB引用Shared和Lib_B。
  4. 如果需要,如上面所述添加控制源代码差异的编译变量。