.NET Framework 4.8项目突发MSB4120 Roslyn编译警告求解决
问题描述
我的C# .NET Framework 4.8项目突然触发多条MSB4120警告:
\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.4.1.0\build\net472\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.targets(13,9): message : MSB4120: Item 'RoslynCompilerFiles' definition within target references itself via (qualified or unqualified) metadatum 'RecursiveDir'. This can lead to unintended expansion and cross-applying of pre-existing items. More info: https://aka.ms/msbuild/metadata-self-ref
\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.4.1.0\build\net472\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.targets(13,9): message : MSB4120: Item 'RoslynCompilerFiles' definition within target references itself via (qualified or unqualified) metadatum 'Filename'. This can lead to unintended expansion and cross-applying of pre-existing items. More info: https://aka.ms/msbuild/metadata-self-ref
\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.4.1.0\build\net472\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.targets(13,9): message : MSB4120: Item 'RoslynCompilerFiles' definition within target references itself via (qualified or unqualified) metadatum 'Extension'. This can lead to unintended expansion and cross-applying of pre-existing items. More info: https://aka.ms/msbuild/metadata-self-ref
(已移除错误中的具体目录信息)
点击警告会定位到该NuGet包内的XML代码片段:
<Target Name="SetRoslynCompilerFiles" > <Message Text="Using Roslyn from '$(RoslynToolPath)' folder" /> <ItemGroup> <RoslynCompilerFiles Include="$(RoslynToolPath)\*"> <Link>roslyn\%(RecursiveDir)%(Filename)%(Extension)</Link> <!-- 警告所在行 --> </RoslynCompilerFiles> </ItemGroup> </Target>
完整XML文件路径:\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.4.1.0\build\net472\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.targets
已尝试的无效操作:
- 删除所有bin和obj文件夹
- 卸载并重新安装DotNetCompilerPlatform包
解决思路
1. 升级NuGet包版本
MSB4120是MSBuild新增的元数据自引用检测规则,Microsoft.CodeDom.Providers.DotNetCompilerPlatform的后续版本(如5.x及以上)已修复该问题。直接在NuGet包管理器中升级到最新稳定版即可消除警告。
2. 手动修改目标文件(临时方案)
若暂时无法升级包,可手动修改报错的.targets文件:
- 打开上述路径下的
Microsoft.CodeDom.Providers.DotNetCompilerPlatform.targets文件 - 将
<Link>节点的元数据引用改为显式指定项类型:
注:此修改会在包重新安装后被覆盖,需重新操作。<Link>roslyn\%(RoslynCompilerFiles.RecursiveDir)%(RoslynCompilerFiles.Filename)%(RoslynCompilerFiles.Extension)</Link>
3. 禁用MSB4120警告
如果警告不影响项目编译与运行,可在项目文件(.csproj)中添加配置禁用该警告:
<PropertyGroup> <MSBuildWarningsAsMessages>$(MSBuildWarningsAsMessages);MSB4120</MSBuildWarningsAsMessages> </PropertyGroup>
4. 检查MSBuild版本
确保使用的MSBuild版本与.NET Framework 4.8兼容,推荐使用MSBuild 16.x或更高版本,旧版本可能对新的元数据检测规则处理存在问题。
内容的提问来源于stack exchange,提问作者Simon Parker

