dotnet build构建.NET Core3.1报错但MSBuild正常的原因咨询
我有若干基于C# .NET Core 3.1开发的类库。
执行如下命令构建项目时:
dotnet build "core\core.csproj"
会抛出以下错误:
C:\Users\christos.nuget\packages\visual-stylecop.msbuild\4.7.59\build\Visual-StyleCop.MSBuild.Targets(107,5): error MSB4062: The "StyleCopTask" task could not be loaded from the assembly C:\Users\christos.nuget\packages\visual-stylecop.msbuild\4.7.59\build..\tools\StyleCop.dll. Could not load file or assembly 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. The system cannot find the file specified. Confirm that the
declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask.
但使用Visual Studio 2019自带的MSBuild执行以下命令时:
& 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe' "core\core.csproj"
构建过程可顺利完成,无任何报错。
两种构建行为的差异核心来自两个命令使用的MSBuild运行时环境完全不同:
dotnet build调用的是运行在.NET Core运行时上的MSBuild版本,该版本默认不携带、也不会主动加载.NET Framework专属的系统程序集。你项目中引用的visual-stylecop.msbuild 4.7.59是仅适配.NET Framework环境的老旧MSBuild任务包,其内置的StyleCopTask任务强依赖.NET Framework框架自带的System.Windows.Forms桌面程序集,.NET Core运行时环境中不存在该程序集,因此直接抛出任务加载失败的错误。- 你调用的VS2019安装目录下的
MSBuild.exe,是基于.NET Framework运行的完整版MSBuild,运行时可以直接访问全局程序集缓存中所有.NET Framework内置组件,System.Windows.Forms属于.NET Framework桌面环境的默认自带程序集,StyleCopTask的所有依赖都可以被正常解析加载,因此构建流程可以顺利完成。
如果需要让dotnet build也能正常执行构建,直接卸载老旧的visual-stylecop.msbuild包,替换为适配跨平台、跨运行时的StyleCop.Analyzers代码分析包即可。该包基于Roslyn分析器实现,不依赖.NET Framework专属组件,在两种构建环境下都可以正常运行。
内容的提问来源于stack exchange,提问作者user3417479

