【问题标题】:Keeping projects in sync across multiple .NET versions跨多个 .NET 版本保持项目同步
【发布时间】:2012-07-22 02:52:11
【问题描述】:

我需要在我的应用程序中创建一些在 .NET 3.5 和 .NET 4.0 中都可用的核心库。我很高兴创建多个项目,创建所需的定义并使用#ifdef 来控制哪些代码使其进入哪个输出程序集。

但是,我想知道是否有办法使这些项目保持同步?当我在 XNA 下开发时,我有一个 Windows 构建和一个 Windows Phone 构建 - XNA 将一个属性注入到名为XnaCrossPlatformGroupID 的项目文件中。它的作用是使 Visual Studio 能够自动确保将文件添加到项目中时,将其添加到相应的项目中。因此,例如,如果我将名为 Foo.cs 的文件添加到我的项目的 Windows 副本中,那么相同的文件将添加到项目的 Windows Phone 副本中。

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

【问题讨论】:

    标签: c# visual-studio-2010 visual-studio build-process


    【解决方案1】:

    我做的是:

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

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

    (这与“添加为链接”基本相同,但不需要在每个文件的基础上完成)

    这是所有 *.cs 文件的递归包含,所以一切都在其中。无需文件维护。


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

    【讨论】:

    • 递归包含的东西很酷 - 但我看到的一个缺陷是,即使某些文件丢失,您也无法在解决方案资源管理器中看到它(这使事情变得更容易)。我还尝试了可移植类库位 - 但它过于严格,并且在某些文件跨平台更改时无济于事。我还必须在 Android 和 iOS 上编译我的代码(使用 MonoDroid 和 MonoTouch)。
    • @ananthonline 我在 protobuf-net 上使用递归的东西已经 4 年了;从来没有导致过问题:)
    • 喜欢。我已经阅读了有关可移植类库的信息——但是否可以使用它们来定位多个 .NET Framework 版本?我必须承认我有点蹩脚并没有尝试,因为看起来他们的目标是跨平台而不是框架版本的可移植性......
    • @MarcGravell 这很有趣——我一定会尝试的。是否也有条件包含机制?
    • 我接受了这个(我非常惊讶它只得到了我的投票!)。但是我尝试了可移植类库,但看不到让它们针对多个 .NET 版本的方法(至少在 VS2010 下)。因此,除非我遗漏了什么,否则可能值得删除该部分。
    【解决方案2】:

    我对跨平台项目所做的就是拥有不同的 sln,每个 sln 用于一个平台。

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

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

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

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

    【讨论】:

    • 这是否意味着您实际上必须将文件添加到项目 a) 然后将其作为链接添加到项目 b)?因为这几乎正是我试图避免的场景......
    • 我手动将其添加为两个项目的链接。由于我的文件数不是太大,我可以这样做。如果以后文件数量增加,我可能会考虑 Marc Gravell 的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2015-09-21
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多