如何在MSBuild或DotNet CLI中用项目/程序集名设置C# ErrorLog文件名
如何让C#编译器ErrorLog文件名包含项目/程序集名
问题原因
直接在命令行传递/property:ErrorLog=$(AssemblyName).sarif时,$(AssemblyName)会被当前shell(比如CMD/PowerShell)优先解析为字面字符串,而非传递给MSBuild读取项目属性,最终生成的日志文件名为$(AssemblyName).sarif而非预期的项目/程序集名。
解决方案
1. 命令行转义属性引用
针对不同shell,转义$符号让MSBuild能正确解析项目属性:
- Windows CMD
msbuild mysolution.sln /property:ErrorLog=^$(AssemblyName).sarif - PowerShell
msbuild mysolution.sln /property:ErrorLog=`$(AssemblyName).sarif # 或用单引号包裹属性值 msbuild mysolution.sln /property:'ErrorLog=$(AssemblyName).sarif' - Bash/Linux Shell
msbuild mysolution.sln /property:ErrorLog=\$(AssemblyName).sarif # 或用单引号包裹属性值 msbuild mysolution.sln /property:'ErrorLog=$(AssemblyName).sarif'
2. 直接修改项目文件(推荐长期使用)
打开项目的.csproj文件,在<PropertyGroup>节点中添加ErrorLog配置,MSBuild会自动解析项目属性:
<PropertyGroup> <!-- 可替换为$(ProjectName)生成项目名命名的日志 --> <ErrorLog>$(AssemblyName).sarif</ErrorLog> </PropertyGroup>
之后执行常规构建命令即可:
msbuild mysolution.sln
3. 使用MSBuild响应文件
创建一个响应文件(如build-config.rsp),写入以下内容:
/property:ErrorLog=$(AssemblyName).sarif
执行构建时指定响应文件:
msbuild mysolution.sln @build-config.rsp
响应文件中的属性引用会被MSBuild直接解析,无需转义。
内容的提问来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

