dotfuscator с "сборкой dotnet" или "публикацией dotnet" - не удалось загрузить задачу "FindProjectAssemblies" PreEmptive.Dotfuscator.Internal.Tasks.dll
При создании приложения ядра.net, которое пытается использовать dotfuscator, мы можем успешно создавать и обфусцировать с помощью msbuild.exe, однако любая сборка или публикация с использованием.net core cli не удалась.
Эти проблемы существуют с использованием локальной командной строки, а также в наших конвейерах сборки devops.
Примеры
msbuild.exe "файл проекта.csproj" <- это работает и включает dotfuscator
dotnet build "файл проекта.csproj" <- выдает ошибку ниже.
dotnet публикует "файл проекта.csproj" <- также выдает ошибку ниже.
D: \ Repos \ PF \ tools \ dotfuscator \ PreEmptive.Dotfuscator.Common.targets (262,5): ошибка MSB4062: не удалось загрузить задачу "FindProjectAssemblies" из сборки D:\Repos\PF\tools\dotfuscator\PreEmptive.Dotfuscator.Internal.Tasks.dll. Не удалось загрузить файл или сборку "Microsoft.Build.Utilities.v4.0, версия =4.0.0.0, культура = нейтральная, PublicKeyToken=b03f5f7f11d50a3a". Система не может найти указанный файл. Убедитесь, что объявление правильное, что сборка и все ее зависимости доступны и что задача содержит открытый класс, который реализует Microsoft.Build.Framework.ITask. [D:\Repos\PF\ источник \xxxxx.xxxxx.xxxxx.API\xxxxx.xxxxxx.xxxxxx.API.csproj]
Очень похоже на этот вопрос. https://github.com/Microsoft/msbuild/issues/2111
1 ответ
Dotfuscator может защищать сборки.NET Core, которые затем можно запускать в.NET Core (то есть, кроссплатформенно). Однако на момент написания этой статьи сам Dotfuscator работает только на классической платформе Windows.NET Framework.
Похоже, что вы интегрировали Dotfuscator Professional в свою сборку рекомендованным способом, который использует цели и задачи Dotfuscator MSBuild. Инструкции включают добавление этого <Import>
в файл вашего проекта:
<Import Project="$(MSBuildExtensionsPath)\PreEmptive\Dotfuscator\4\PreEmptive.Dotfuscator.Common.targets"/>
Когда я сделал это для проекта.NET Core, я мог собрать в Visual Studio или через msbuild /t:Publish /p:Configuration=Release
и получите защищенное приложение. Но если бы я попытался бежать dotnet build MyApp.csproj
или же dotnet publish MyApp.csproj
сборка не удалась. Сначала я получил сообщение об ошибке, отличное от вас:
ошибка MSB4019: импортированный проект "C:\Program Files\dotnet\sdk\2.1.503\PreEmptive\Dotfuscator\4\PreEmptive.Dotfuscator.Common.targets" не найден. Убедитесь, что путь в объявлении правильный, и что файл существует на диске.
Это связано с тем, что Dotfuscator не устанавливает свои цели MSBuild в расположение.NET Core, а только в расположения.NET Framework и Visual Studio, поэтому <Import>
выше не находит нужные файлы.
Если я вместо этого скопирую файлы MSBuild из C:\Program Files (x86)\MSBuild
в мое собственное местоположение, такое как C:\DotfuscatorMSBuildCopy
и изменить <Import>
соответственно:
<Import Project="C:\DotfuscatorMSBuildCopy\PreEmptive\Dotfuscator\4\PreEmptive.Dotfuscator.Common.targets"/>
тогда я вижу вашу ошибку:
ошибка MSB4062: не удалось загрузить задачу "FindProjectAssemblies" из сборки C:\DotfuscatorMSBuildCopy\PreEmptive\Dotfuscator\4\PreEmptive.Dotfuscator.Internal.Tasks.dll. Не удалось загрузить файл или сборку "Microsoft.Build.Utilities.v4.0, версия =4.0.0.0, культура = нейтральная, PublicKeyToken=b03f5f7f11d50a3a". Система не может найти указанный файл. Убедитесь, что объявление правильное, что сборка и все ее зависимости доступны и что задача содержит открытый класс, который реализует Microsoft.Build.Framework.ITask.
Решение заключается в создании с использованием msbuild /t:Publish /p:Configuration=Release
вместо dotnet
,
(Примечание: я работаю в команде Dotfuscator и отвечаю в этом качестве.)