【问题标题】:How to organize source code of class library projects which will be built for multiple platforms?如何组织将要为多个平台构建的类库项目的源代码?
【发布时间】:2013-01-06 21:38:11
【问题描述】:

我正在开发一个类库项目,该项目为客户端应用程序提供了许多有用的扩展方法。 该项目预计将用于各种平台(.NET 框架的版本)。

为了做到这一点,我将使用几个单独的 Visual Studio 项目,每个项目都用于自己的平台。 这些项目可以有自己的外部依赖项,尽管源代码将使用“添加为引用”功能在它们之间共享。 这种方法将允许我通过在一个文件中编写代码来更改所有项目的实现,而无需将其复制到其他项目。 记住目标框架的差异,我需要使用#if 编译器指令。 每个项目的结果将作为特定版本的 .NET 框架的 NuGet 包发布。

我有两个问题:

  1. 每个新文件都必须添加到每个项目中,否则不会 被编译并且其中定义的每个类都将无法访问 某个平台。你可以意识到很容易忘记这一点。 有没有办法避免这种文件跟踪?是否可以 自动化?
  2. 如何改进整个基础架构?您在项目中使用了哪些方法和/或解决方案?

【问题讨论】:

    标签: c# visual-studio projects-and-solutions code-organization


    【解决方案1】:

    为了做到这一点,我将使用几个单独的 Visual Studio 项目,每个项目都用于自己的平台。

    您不需要这样做。同一个项目可以有多个配置。您需要通过编辑项目文件来处理它,但您只需执行一次(或至少,每次需要添加新平台时执行一次)。使用在每个项目配置中定义的条件编译符号允许您在每个构建配置中排除某些源代码。

    我之前做过几次,这是我用来允许在Noda Time 中构建 PCL 的方法。我最终得到了 6 种配置:

    • 调试
    • 调试 PCL
    • 发布
    • 发布 PCL
    • 签名发布
    • 签名版本 PCL

    显然,您的需求可能会有所不同(尤其是在签名方面),但它现在对我们来说工作正常 - 我认为这比手动保持多个项目文件同步要好得多。

    另一种选择是为每个平台创建一个“骨架”项目文件和一个“主”项目文件,并为除主平台之外的所有平台生成真正的项目文件。因此,您需要将新的源文件引用添加到主项目文件中,然后重新生成所有其他文件。这确实意味着编写代码来做到这一点,请注意……或者使用我们用于protobuf-csharp-port的项目:csprojectprojector

    【讨论】:

    • :P。 +1 用于不同的配置。
    • 感谢您分享您的做法。如果我的一些项目有自己的外部依赖项,你的方法是否仍然适用?例如MyLibForFW4 使用CoolOuterLibForFW4MyLibForWinPhone 使用CoolOuterLibForWinPhone?
    • @Jon Skeet:如果您需要根据配置有选择地链接 dll,这是否也适用?我问了一个类似的问题:stackoverflow.com/questions/13836501/…。据我了解,我无法单独使用项目配置启用/禁用 dll 链接。我说的对吗?
    • @keykeeper:是的,您也可以根据 msbuild 文件中的属性进行引用。
    • @Heisenbug:这个问题似乎是关于 using 指令,而不是 DLL。但是,是的,您可以使程序集引用有条件(手动)。
    【解决方案2】:

    另一种方法是使用通配符,而不是在项目中包含单个文件。这也需要手动编辑您的项目文件,但这将是一项一次性任务。我从来没有使用过这种方法,但我看到其他人提到过。

    http://msdn.microsoft.com/en-us/library/ms171454(v=vs.100).aspx

    【讨论】:

    • 谢谢。这正是我现在在我的项目中所做的。
    猜你喜欢
    • 2014-03-04
    • 2019-01-06
    • 2015-07-29
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多