#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. Есть ли способ решить эту проблему?