如何通过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
相关产品推荐
相关产品推荐

