Не удается загрузить требуемую сборку для задачи MSBuild

#c# #visual-studio #msbuild

#c# #visual-studio #MSBuild

Вопрос:

Я пытаюсь выполнить простую задачу после сборки в консольном приложении .NET Core.

Вот мой cspoj:

 <Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.Build.Utilities.Core" Version="16.8.0" />
    </ItemGroup>


    <UsingTask TaskName="SimpleTask" AssemblyFile = "binDebugnetcoreapp3.1ConsoleApp10.dll">

    </UsingTask>

    <Target Name="MyTarget" AfterTargets="Build">
        <SimpleTask/>
    </Target>

</Project>
 

И вот класс task:

 using Microsoft.Build.Utilities;


namespace ConsoleApp10.MyTasks
{
    public class SimpleTask : Task
    {
        public override bool Execute()
        {
            Log.LogWarning("warning message");
            return true;
        }

        public string MyProperty { get; set; }
    }
}
 

Но я получаю следующую ошибку:

 Error   MSB4018 The "SimpleTask" task failed unexpectedly.
System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
File name: 'System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at ConsoleApp10.MyTasks.SimpleTask.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 [HKLMSoftwareMicrosoftFusion!EnableLog] (DWORD) to 1.
 

Я не мог понять, в чем проблема.

Ответ №1:

В папке bin, из которой вы загружаете свою DLL-библиотеку Task, нет всех библиотек DLL, необходимых для фактического запуска сборок, поскольку ожидается, что они будут загружены с определенными библиотеками DLL, поставляемыми из других источников. Похоже, что MSBuild не находит эти доступные DLL (это зависит от поведения загрузки конкретного загрузчика).

Попробуйте добавить следующее в csproj, который будет использовать все возможные сборки для поиска MSBuild:

 <PropertyGroup>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
 

Публикация, а не просто сборка проекта, предоставляющего задачу, должна достичь того же.

(вышесказанное является предположением, но оно того стоит)

PS Я бы рекомендовал предоставить задачу из проекта, отличного от того, который ее использует — здесь вы попали в ситуацию с курицей и яйцом

Комментарии:

1. Предложение группы свойств не сработало, но перенос задачи в другой проект сработал, спасибо. Кстати, после сборки консольного проекта я пытаюсь внести изменения в проект задачи и перестроить его, но VS не может скопировать выходные данные папки obj в каталог bin, потому что он заблокирован процессом MSBuild. Итак, я должен каждый раз завершать процесс MSBuild. Есть ли способ решить эту проблему?