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

.NET 6.0自定义MSBuild任务可通过dotnet运行但VS2022中失败

问题描述

我有一个包含自定义MSBuild任务的简单项目,该任务可通过dotnet msbuild命令正常运行,但在VS2022中执行失败。除了.NET 6.0引入的架构相关问题外,我未在网上找到其他相关内容,且认为该架构问题不适用于当前场景。既然dotnet CLI可正常构建,我肯定遗漏了某些内容,想请教具体原因。

项目文件代码

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.2.0" />
    </ItemGroup>
    <UsingTask TaskName="PublishValidationTask" 
               AssemblyFile="..\bin\Debug\net6.0\ConsoleApp25.dll" />
    <Target Name="MyTarget" 
            AfterTargets="Build">
        <PublishValidationTask />
    </Target>
</Project>

自定义任务代码

using Microsoft.Build.Framework;
using Task = Microsoft.Build.Utilities.Task;

namespace ConsoleApp25;

public class HelloWorldTask : Task
{
    public override bool Execute()
    {
        Log.LogMessage(MessageImportance.High, "Hello World");            
        return true;
    }
}

错误信息

Severity    Code    Description Project File    Line    Suppression State
Error   MSB4018 The "HelloWorldTask" task failed unexpectedly.
System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
File name: 'System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at ConsoleApp25.HelloWorldTask.Execute()
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].
原因及解决方法

核心原因

VS2022内置的MSBuild进程基于.NET Framework运行,而你的自定义任务被编译为.NET 6程序集。.NET Framework无法直接加载.NET Core/.NET 5+的程序集,因此会出现找不到System.Runtime这类.NET Core基础库的错误。而dotnet msbuild基于.NET Core运行,所以能正常加载你的.NET 6任务程序集。

另外,项目文件里存在明显错误:UsingTask指定的TaskName是PublishValidationTask,但实际自定义任务类名是HelloWorldTask,这也会导致任务无法正确匹配。

解决步骤

  1. 拆分自定义任务到独立的.NET Standard 2.0项目

    • 新建类库项目,将目标框架设置为.NET Standard 2.0(该版本程序集可同时被.NET Framework和.NET Core/.NET 6兼容加载)。
    • 在类库项目中引用Microsoft.Build.Utilities.Core包(推荐使用与VS2022匹配的17.x系列版本)。
    • 将HelloWorldTask代码迁移到这个新类库项目中。
  2. 修正主项目的任务引用

    • 在主项目中添加对自定义任务项目的项目引用,确保构建时先编译任务项目:
      <ItemGroup>
        <ProjectReference Include="..\[自定义任务项目名]\[自定义任务项目名].csproj" />
      </ItemGroup>
      
    • 修改UsingTask节点,指向自定义任务项目的输出程序集,同时修正TaskName为实际类名:
      <UsingTask TaskName="ConsoleApp25.HelloWorldTask" 
                 AssemblyFile="..\[自定义任务项目名]\bin\$(Configuration)\netstandard2.0\[自定义任务项目名].dll" />
      
  3. 调整目标依赖
    通过项目引用已能保证自定义任务项目先编译,无需额外配置目标执行顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:18:09