You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过msbuild编译时传值并在运行时使用?兼容.NET 6+与.NET 4.8

编译时通过MSBuild传递参数到运行时的简洁实现方法

核心方案:程序集元数据+代码读取

该方案无需手动生成代码文件,依赖MSBuild内置机制,兼容指定框架版本,且不会影响项目增量编译检查。

步骤1:修改项目文件(.csproj)

添加配置将MSBuild参数映射为程序集元数据,同时设置默认空值确保未传参时编译正常:

<PropertyGroup>
  <MyValue Condition=" '$(MyValue)' == '' "></MyValue>
</PropertyGroup>

<ItemGroup>
  <AssemblyMetadata Include="MyValue" Value="$(MyValue)" />
</ItemGroup>

步骤2:编写静态读取类

在代码中创建静态类,用于读取嵌入的程序集元数据:

using System.Reflection;
using System.Linq;

public static class Something
{
    public static string MyValue => 
        Assembly.GetExecutingAssembly()
                .GetCustomAttributes<AssemblyMetadataAttribute>()
                .FirstOrDefault(attr => attr.Key == "MyValue")?.Value ?? string.Empty;
}

步骤3:使用示例

直接在业务代码中调用静态属性:

System.Console.WriteLine($"Value is '{Something.MyValue}'");

效果验证

  • 传参编译:执行msbuild /p:MyValue=Foo,程序输出Value is 'Foo'
  • 未传参编译:直接执行msbuild,程序输出Value is ''

备选方案:编译常量(适用于简单字符串场景)

如果参数值无特殊字符,可使用编译常量实现,代码更简洁:

修改项目文件

<PropertyGroup>
  <MyValue Condition=" '$(MyValue)' == '' "></MyValue>
  <DefineConstants>$(DefineConstants);MY_VALUE="$(MyValue)"</DefineConstants>
</PropertyGroup>

静态类实现

public static class Something
{
    public const string MyValue = MY_VALUE;
}

注意:此方案不支持含引号、特殊转义字符的参数值,转义处理较为繁琐。


内容的提问来源于stack exchange,提问作者Anders Forsgren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:15:42