You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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类库:

  1. 创建.NET Framework类库项目,继承Microsoft.Build.Utilities.Task实现CheckFileAge逻辑
  2. 编译后在props文件中引用该类库:
    <UsingTask TaskName="CheckFileAge" AssemblyFile="path/to/YourTaskLibrary.dll" />
    

内容的提问来源于stack exchange,提问作者SpaceGhost440

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:40:55