2012-07-23 69 views
4

我需要在我的应用程序中创建一些核心库,这些库将在.NET 3.5和.NET 4.0中提供。我很高兴创建多个项目,创建所需的定义,并使用#ifdef来控制哪些代码将其转换为哪个输出组件。让项目在多个.NET版本中保持同步

但是,我想知道的是,如果有一种方法来保持这些项目同步?当我在XNA下开发时,我有一个Windows版本和一个Windows Phone版本 - 并且XNA将一个属性注入名为XnaCrossPlatformGroupID的项目文件。它的作用是使Visual Studio自动确保在将文件添加到项目中时将其添加到相应的项目中。所以,例如,如果我将一个名为Foo.cs的文件添加到我的项目的Windows副本中,则会将该文件添加到项目的Windows Phone副本中。

是否有任何方式复制Visual Studio中的一组正常项目的这种行为?我不希望使用构建配置,因为我希望能够在一个步骤中编译所有目标平台,而无需借助IDE之外的工具(比如TeamCity)。还是有另一种方法可以让一个项目针对多个目标而构建,而无需使用20种不同的构建配置来解决该解决方案?

回答

7

我要做的就是:

  • 有一个“正规”的csproj,我使用的大部分我开发的,添加文件等 - 但是记住,真的所有文件“在”
  • 对于其他的csproj,使用类似:

    <ItemGroup> 
        <Compile Include="..\Foo\**\*.cs" /> 
    </ItemGroup> 
    

(即基本上是一样的 “添加为链接”,b而不需要在每个文件的基础上完成)

这是一个递归包含所有* .cs文件,所以一切都在。没有文件维护需要。


如果你想针对多种框架(而不是多个版本),那么另一种选择可能是:使用Portable Class Library。这是一个适用于多个框架的单个项目,,但仅限于您定位平台的严格交叉功能。在VS2010中,这是一个附加功能;它默认包含在VS 11中。

+0

递归包含的东西很酷 - 但我看到的一个缺陷是,即使某些文件丢失了,您也无法在解决方案资源管理器中看到它(这使事情变得更容易)。 我也尝试过可移植类库 - 但它太严格了,并且在某些文件跨平台更改时无济于事。我也必须在Android和iOS上编译我的代码(使用MonoDroid和MonoTouch)。 – Ani 2012-07-23 20:43:34

+0

@ananthonline我一直在protobuf-net上使用递归事物4年;从来没有导致问题:) – 2012-07-23 20:56:56

+0

我* *爱*。我曾阅读过有关可移植类库的信息 - 但可以使用它们来定位多个.NET Framework版本吗?我必须承认我有点跛脚,并没有尝试过,因为它看起来像是针对跨平台而不是Framework版本的可移植性...... – 2012-07-23 20:57:22

0

我对跨平台项目所做的工作是为每个平台设置不同的slns。

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

请注意,您也可以将一个解决方案添加到Visual Studio中的另一个解决方案。这种“组合”解决方案可用于所有平台的自动构建。

例子:https://github.com/ananthonline/graffiti

这对我的作品很大,因人而异。希望这可以帮助。

+0

这是否意味着您实际上必须将文件添加到项目a),然后将其添加为项目b)的链接?因为这几乎是我试图避免的场景...... – 2012-07-23 20:58:10

+0

我将它作为手动链接添加到两个项目中。由于我的文件数量不是很大,我可以做到这一点。如果文件数量在以后增加,我可能会考虑Marc Gravell的方法。 – Ani 2012-07-23 21:00:30

相关问题