【问题标题】:Conditionally compiling entire namespaces - C#有条件地编译整个命名空间 - C#
【发布时间】:2011-02-05 02:25:30
【问题描述】:

我想知道是否有一种方法可以在 C# 中有条件地编译整个命名空间。还是我不得不用预处理器指令显式地装饰命名空间中的每个源文件以排除它?在我的应用程序的子版本中,根本不需要各种命名空间中的代码,我希望将其排除在外。

提前致谢!

【问题讨论】:

    标签: c# namespaces compilation conditional


    【解决方案1】:

    如果您的命名空间位于不包含任何其他内容的单独程序集中,您可以使用配置管理器为您的特定子版本并取消选中“构建”复选框。

    如果您在程序集中还有其他类,尽管它们显然不会被构建或包含,那么唯一的方法就是使用预处理器声明进行装饰。

    【讨论】:

      【解决方案2】:

      您需要将条件编译指令放在每个文件中。无法将整个命名空间标记为条件编译。

      作为Michael notes in his answer,一个可能的解决方案是将条件代码分解到一个单独的项目(程序集)中,并且只为需要它的配置提供该程序集;但这将取决于条件代码的性质。

      【讨论】:

      • 感谢您的补充说明。
      【解决方案3】:

      您可以通过装饰每个文件来做到这一点,也可以通过选择要包含的文件来做到这一点。 MSBuild 和 csc 都可以选择将所有文件包含在一个路径下,并且 MSBuild 还可以根据属性有条件地包含构建项(而不是每个配置都需要单独的 csproj)。

      但是直接装饰文件可能更容易;-p

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,在每个文件中使用指令最终变得太多工作;所以我开始在 .csproj 文件中使用条件 标签。

        例如,如果我需要从构建中排除某些文件,我会将这些文件移动到新的 部分...

        <ItemGroup Condition=" '$(SlimBuild)' != 'true' ">
        ...
        </ItemGroup>
        

        ...并使用匹配的属性参数调用 msbuild.exe。

        MSBuild.exe MyApp.msbuild /p:Configuration=Release /p:SlimBuild=true
        

        您可能还可以使用通配符来包含未来的文件。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-28
          • 1970-01-01
          相关资源
          最近更新 更多