我有两个版本的应用程序。第一个使用库LIB_A的引用,第二个使用库LIB_B的引用。 (LIB_A和LIB_B实际上是同一产品的版本,但它们彼此不同,甚至名称空间也不同。在同一台机器上不能同时安装两个版本)。 我在两个版本中的应用程序的源代码几乎相同所以我需要有一个解决方案,可以切换使用哪个库。 我怎样才能做到这一点?
答案 0 :(得分:0)
事实上,Visual Studio 2015(您可以下载Release Candidate,我发现它比VS2013更强大,更快)具有专为此目的而设计的功能 - Shared Projects。这是描述它的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 :(得分:0)
由于您在评论中指定了VS2010,我单独添加此答案,以便VS2015的用户可以参考另一个答案,这样会更清晰。
在VS2010中,您可以使用两个项目之间的源代码共享。我们假设您已经创建了AppA,这是一个引用LibA的应用程序项目,并包含该应用程序的所有来源。
您可以创建一个引用LibB的应用程序项目AppB。它还分享 AppA的所有来源。这可以通过以下两种方式之一完成:
手动关联所有来源
在AppB中,您可以创建与AppA相同的文件夹结构(如果有)。右键单击每个子文件夹,然后单击Add-> Existing Item ...导航到AppA的相应文件夹并选择所有C#文件。现在点击Add按钮右侧的下拉列表,然后选择" Add as Link"。您会注意到添加的来源有一点共享"在他们的图标中的箭头,他们的路径指向原始。
动态链接所有来源
如果AppA中有大量文件,或者定期添加/删除文件,以前的方法可能会很累人。还有另一种方法,包括手动编辑AppB.csproj。打开AppB.csproj并创建一个ItemGroup
,从AppA导入所有文件。此代码假定AppA和AppB是解决方案文件夹的子文件夹。如果不是,请适当更改相对路径。
<ItemGroup>
<Compile Include="..\AppA\\**\*.cs">
<Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
</Compile>
</ItemGroup>
现在,当您打开解决方案时,您将看到AppB的内容与AppA的内容相匹配。来源是链接的,因此AppB的条件构建设置(如果有的话)将适用。
您还可以通过向Exclude
标记添加Compile
属性来排除包含文件。有关详细信息,请参阅VS文档。
这种方法的唯一缺点是你需要手工编辑csproj文件。此外,如果您不小心删除或移动链接文件,VS会将链接文件列表硬编码到项目中。文件本身仍将被链接。