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

VS project referenced from two excluded libraries

我有两个版本的应用程序。第一个使用库 LIB_A 的引用,第二个使用库 LIB_B 的引用。 (LIB_A和LIB_B其实是同一个产品的版本,只是不同,甚至命名空间都是different.There不能在一台机器上安装两个版本同时)。 我的应用程序在两个版本中的源代码几乎相同,所以我需要一个解决方案,可以切换使用哪个库。 我怎样才能做到这一点?

碰巧 Visual Studio 2015(您可以下载 Release Candidate,我发现它比 VS2013 更强大、更快)具有专为此目的设计的功能 - Shared Projects. Here's a Channel9 video 描述它。

共享项目包含直接编译到引用它的项目中的源文件。假设共享项目 Shared 有一个文件 foo.cs,项目 AppA 和 AppB 都引用项目 Shared,然后文件 foo.cs 直接编译到 AppA 和 AppB - 它使用这些项目的任何条件设置。所以 foo.cs 可以有这样的代码

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

总结一下:

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

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

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

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

手动链接所有源

在 AppB 中,您可以创建与 AppA 相同的文件夹结构(如果有)。右键单击每个子文件夹,然后单击添加->现有项...导航到 AppA 的相应文件夹和 select 所有 C# 文件。现在单击“添加”按钮右侧的 下拉列表 和 select "Add as Link"。您会注意到添加的源在其图标中有一个小 "shared" 箭头,并且它们的路径指向原始路径。

动态链接所有源

如果您在 AppA 中有很多文件,或者经常有 add/remove 个文件,以前的方法可能会很累。还有另一种方法可以做到这一点,涉及手动编辑 AppB.csproj。打开 AppB.csproj 并创建一个从 AppA 导入所有文件的 ItemGroup。此代码假定 AppA 和 AppB 是解决方案文件夹的子文件夹。如果不是,请适当更改相对路径。

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

现在打开解决方案,您会看到AppB 的内容与AppA 的内容相匹配。源已链接,因此 AppB 的条件构建设置(如果有)将适用。

您还可以通过向 Compile 标签添加 Exclude 属性来排除文件。有关详细信息,请参阅 VS 文档。

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