在编译期间使用 MSBuild.exe 设置布尔变量

Posted

技术标签:

【中文标题】在编译期间使用 MSBuild.exe 设置布尔变量【英文标题】:Set Boolean variable during the compile time using MSBuild.exe 【发布时间】:2021-05-21 13:21:45 【问题描述】:

在我们的 C# 代码中,我们有一个带有布尔变量 IS_FEATURE_X_ENABLED 的静态类,我们希望能够在编译期间设置此变量,这意味着当我们调用 MSBuild.exe 时,该值将作为参数包含在内。例如:

MSBuild.exe FeatureFlexibleApp.sln -p:IsFeatureXEnabled=true

这样做的原因是我们希望能够构建具有特定配置的二进制文件,但在编译之前这个值是未知的。如果客户想要这个功能,他们可以在我们的网页上选择它,二进制文件将在 Jenkins 服务器上构建和打包,然后下载链接将发送给用户(通过电子邮件或将显示在网页上如果他们等待编译完成)。在这种情况下,只使用了一个变量,但实际上这个数字不必有限制(因此预先构建所有可能的组合不是一个可行的选择)。

【问题讨论】:

这能回答你的问题吗? msbuild, defining Conditional Compilation Symbols @Slate 到目前为止,第一个答案是与我的问题最接近的答案,但它缺少使用示例,并且 canton7 在下面的答案中提供了一个(带有预处理器指令)。没有一个例子,我仍然无法弄清楚。不过,我感谢您的评论,因为它会给我一个重要的提示。 【参考方案1】:

您有 2 个选项。

首先是使用这个MSBuild属性来控制是否定义了特定的预处理器符号,然后在你的C#代码中使用#if

<PropertyGroup>
  <DefineConstants Condition="'$(IsFeatureXEnabled)' == 'true'">$(DefineConstants);IS_FEATURE_X_ENABLED</DefineConstants>
</PropertyGroup>

然后:

#if IS_FEATURE_X_ENABLED
    // Code compiled only if feature X is enabled
#endif

但是,如果你走这条路,更容易废弃 csproj 中的样板,直接从命令行设置 DefineConstants:

MSBuild.exe FeatureFlexibleApp.sln -p:DefineConstants=IS_FEATURE_X_ENABLED

另一种是使用MSBuild属性的值来写一个程序集级的属性,然后在运行时用代码读取这个属性。

在程序集的不同构建之间唯一会发生变化的是这些程序集级属性的值:其他一切都是在运行时确定的,这可能是也可能不是您想要的。但是,这确实意味着您可以将任何旧字符串传递到代码中,而不仅仅是启用/未启用二进制。

<ItemGroup>
  <AssemblyAttribute Include="Namespace.Of.Your.ConfigurationAttribute">
    <IsFeatureXEnabled>$(IsFeatureXEnabled)</IsFeatureXEnabled>
  </AssemblyAttribute>
</ItemGroup>
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
internal class ConfigurationAttribute : Attribute

    public string IsFeatureXEnabled  get; set; 


...

bool isFeatureXEnabled = typeof(...).Assembly
    .GetCustomAttribute<ConfigurationAttribute>().IsFeatureXEnabled == "true"

【讨论】:

第一个选项非常适合我。非常感谢!我已经找了两天了,几乎失去了希望。

以上是关于在编译期间使用 MSBuild.exe 设置布尔变量的主要内容,如果未能解决你的问题,请参考以下文章

CMake ERROR Failed to run MSBuild command: MSBuild.exe

如何在批处理文件中调用设置为“C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe”的变量?

MSBuild.exe 已停止 cmake 错误

使用BuildTools_Full.exe安装时,Windows中安装的MSBuild.exe在哪里?

msbuild编译

带有VS2012的Windows 8上的msbuild.exe位置