C# 跨多个.NET版本保持项目同步

C# 跨多个.NET版本保持项目同步,c#,visual-studio-2010,visual-studio,build-process,C#,Visual Studio 2010,Visual Studio,Build Process,我需要在我的应用程序中创建一些核心库,这些库将在.NET3.5和.NET4.0中提供。我很乐意创建多个项目,创建所需的定义,并使用#ifdef控制将哪些代码放入哪个输出程序集中 然而,我想知道的是,是否有一种方法可以使这些项目保持同步?当我在XNA下开发时,我有一个Windows版本和一个Windows Phone版本,XNA将一个名为XnaCrossPlatformGroupID的属性注入到项目文件中。它所做的是使VisualStudio能够自动确保在将文件添加到项目中时,它会添加到相应的项目

我需要在我的应用程序中创建一些核心库,这些库将在.NET3.5和.NET4.0中提供。我很乐意创建多个项目,创建所需的定义,并使用
#ifdef
控制将哪些代码放入哪个输出程序集中

然而,我想知道的是,是否有一种方法可以使这些项目保持同步?当我在XNA下开发时,我有一个Windows版本和一个Windows Phone版本,XNA将一个名为
XnaCrossPlatformGroupID
的属性注入到项目文件中。它所做的是使VisualStudio能够自动确保在将文件添加到项目中时,它会添加到相应的项目中。因此,例如,如果我将一个名为
Foo.cs
的文件添加到项目的Windows副本中,那么该文件将添加到项目的Windows Phone副本中

在VisualStudio中,有没有任何方法可以将这种行为复制到一组正常的项目中?我不希望使用构建配置,因为我希望能够在一个步骤中编译所有目标平台,而无需借助IDE之外的工具(例如TeamCity)。或者有没有另一种方法可以让一个项目针对多个目标进行构建,而无需在解决方案中添加20种不同的构建配置?

我所做的是:

  • 有一个“常规”的csproj,我在我的大多数开发中都使用它,添加文件等等,但要记住,实际上所有的文件都是“在”
  • 对于另一个csproj,请使用以下内容:

    <ItemGroup>
      <Compile Include="..\Foo\**\*.cs" />
    </ItemGroup>
    
    
    
(基本上与“添加为链接”相同,但无需按每个文件进行)

这是所有*.cs文件的递归包含,因此所有内容都在其中。不需要文件维护



如果您试图针对多个框架(而不是多个版本),那么另一个选项可能是:使用。这是一个在多个框架上工作的单一项目,仅限于目标平台功能的严格交叉。在VS2010中,这是一个附加功能;默认情况下,它包含在VS 11中。

我对跨平台项目所做的是为一个平台使用不同的SLN

共享代码位于一个公共位置,并“作为链接”添加到正确的csproj中。此csproj还包含任何特定于平台的文件。如果“通用代码”文件需要根据当前平台设置条件,您可以选择将其替换为两个特定于平台的文件,或者在其中添加#ifdef(取决于其中有多少不同)

请注意,您还可以在VisualStudio中向另一个解决方案添加一个解决方案。此“组合”解决方案可用于所有平台的自动构建

例如:


这对我很有用,YMMV。希望这能有所帮助。

递归包含很酷,但我看到的一个缺陷是,即使某些文件丢失,您也无法在解决方案资源管理器中看到它(这使事情变得更简单)。我还尝试了可移植类库位,但它限制太多,在某些文件跨平台更改时也没有帮助。我还必须在Android和iOS上编译我的代码(使用MonoDroid和MonoTouch)。@ananthonline我在protobuf网上使用递归已经4年了;从未导致过问题:)我很喜欢。我读过关于可移植类库的文章,但是有可能使用它们来针对多个.NET Framework版本吗?我必须承认我有点跛脚,没有尝试,因为看起来他们的目标是跨平台的可移植性,而不是框架版本…@MarcGravel这很有趣-我一定会尝试。还有一个有条件的包含机制吗?我接受这一点(我非常惊讶它只得到了我的选票!)。但我尝试了可移植类库,却找不到使它们面向多个.NET版本(至少在VS2010下)的方法。因此,除非我遗漏了什么,否则删除该部分可能是值得的。这是否意味着您实际上必须将该文件添加到项目a)中,然后将其添加为项目b)的链接?因为这正是我试图避免的情况……我手动将其添加为两个项目的链接。因为我的文件数量不是太大,所以我可以这样做。如果文件的数量在以后增加,我可能会考虑Marc Gravell的方法。