使用RoslynCodeTaskFactory仍遇MSB4801错误,Azure DevOps构建失败求助
修复Azure DevOps上RoslynCodeTaskFactory导致的MSB4801构建错误
问题描述
在props文件中使用RoslynCodeTaskFactory后仍触发MSB4801错误,本地机器可正常构建,但Azure DevOps构建失败。
错误信息
Error MSB4801: The task factory "CodeTaskFactory" is not supported on the .NET Core version of MSBuild.
现有任务代码
<UsingTask TaskName="CheckFileAge" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" > <ParameterGroup> <FilePath ParameterType="System.String" Required="true" /> <IsOlder ParameterType="System.Boolean" Output="true" /> </ParameterGroup> <Task> <Using Namespace="System" /> <Using Namespace="System.IO" /> <Code Type="Fragment" Language="cs"> <![CDATA[ var fileInfo = new FileInfo(FilePath); if (!fileInfo.Directory.Exists) { fileInfo.Directory.Create(); } // Ensure the file exists if (!fileInfo.Exists) { // create the file, and release the lock. also sets the LastWriteTime using (fileInfo.Create()) { } IsOlder = true; } else { var fileTime = File.GetLastWriteTime(FilePath); IsOlder = (DateTime.Now - fileTime).TotalHours > 1; } if (IsOlder) { // lets touch the file now, so we will skip deploying for N hours fileInfo.LastWriteTime = DateTime.Now; } ]]> </Code> </Task> </UsingTask>
环境信息
- Azure DevOps:镜像为
windows-latest,.NET Core版本8.0.404 - 本地机器:Microsoft Visual Studio Professional 2022(版本17.12.1),.NET Framework版本4.8.09032,安装的Dotnet SDK包括3.1.426、5.0.408、6.0.428、8.0.404、9.0.100
补充说明:已确认提交代码中已改为正确的任务工厂,但仍报错。
修复方案
1. 强制使用.NET Framework版MSBuild执行构建
Azure DevOps的windows-latest镜像默认可能调用.NET Core版MSBuild(dotnet build),而RoslynCodeTaskFactory仅在.NET Framework版MSBuild中支持:
- 替换构建任务:用
VSBuild任务替代DotNetCoreCLI任务,指定使用Visual Studio 2022的MSBuild环境 - 若必须保留
dotnet build,添加参数-p:UseNetCoreMSBuild=false强制调用.NET Framework版MSBuild
2. 修正AssemblyFile路径
确保$(MSBuildToolsPath)指向.NET Framework版MSBuild目录,而非.NET Core版:
- 可显式指定路径(根据VS版本调整):
AssemblyFile="C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\Microsoft.Build.Tasks.Core.dll" - 或改用
$(MSBuildFrameworkToolsPath)变量,该变量默认指向.NET Framework相关工具路径
3. 清理构建缓存与旧配置
Azure DevOps可能存在缓存导致旧配置生效:
- 在构建任务中启用“清理本地资源”选项,清空构建缓存
- 检查管道是否引用了未更新的旧props文件,确认所有配置均使用
RoslynCodeTaskFactory
4. 替代方案:将内联任务转为独立类库
若上述方法无效,可将内联任务编译为.NET Framework类库:
- 创建.NET Framework类库项目,继承
Microsoft.Build.Utilities.Task实现CheckFileAge逻辑 - 编译后在props文件中引用该类库:
<UsingTask TaskName="CheckFileAge" AssemblyFile="path/to/YourTaskLibrary.dll" />
内容的提问来源于stack exchange,提问作者SpaceGhost440
相关产品推荐
相关产品推荐

