.net-core - 带有“dotnet build”或“dotnet publish”的 dotfuscator - 无法加载“FindProjectAssemblies”任务 PreEmptive.Dotfuscator.Internal.Tasks.dll
问题描述
在构建尝试使用 dotfuscator 的 .net 核心应用程序时,我们可以使用 msbuild.exe 成功构建和混淆,但是使用 .net 核心 cli 的任何构建或发布都会失败。
这些问题存在于使用本地命令行以及我们的 devops 构建管道中。
例子
msbuild.exe "the project file.csproj" <- 这工作并使用 dotfuscator
dotnet build "the project file.csproj" <- 这会引发以下错误。
dotnet publish "the project file.csproj" <- 也会抛出下面的错误。
D:\Repos\PF\tools\dotfuscator\PreEmptive.Dotfuscator.Common.targets(262,5):错误 MSB4062:无法从程序集 D:\Repos\PF\tools\dotfuscator\ 加载“FindProjectAssemblies”任务PreEmptive.Dotfuscator.Internal.Tasks.dll。无法加载文件或程序集“Microsoft.Build.Utilities.v4.0,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”。该系统找不到指定的文件。确认声明正确,程序集及其所有依赖项都可用,并且任务包含实现 Microsoft.Build.Framework.ITask 的公共类。[D:\Repos\PF\source\xxxxx.xxxxx.xxxxx.API\xxxxx.xxxxx.xxxxxx.API.csproj]
解决方案
更新 (2019-12-20) : 我们发布了 Dotfuscator Professional 6.0.0 的测试版,支持在非 Windows 操作系统上运行 Dotfuscator。这包括对dotnet
命令的支持。
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
or 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:无法从程序集 C:\DotfuscatorMSBuildCopy\PreEmptive\Dotfuscator\4\PreEmptive.Dotfuscator.Internal.Tasks.dll 加载“FindProjectAssemblies”任务。无法加载文件或程序集“Microsoft.Build.Utilities.v4.0,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”。该系统找不到指定的文件。确认声明正确,程序集及其所有依赖项都可用,并且任务包含实现 Microsoft.Build.Framework.ITask 的公共类。
解决方案是使用msbuild /t:Publish /p:Configuration=Release
而不是构建dotnet
。
(注意:我为 Dotfuscator 团队工作,并以该身份回答。)
推荐阅读
- javascript - 按名称将特定值更新为多维中的特定索引
- cypress - 鼠标悬停在柏树中
- c# - 如何定义单元测试的不同顺序?
- ocaml - 如何更新记录的某些(但不是全部)字段?
- openid-connect - Onelogin - 成功登录 PKCE 后如何获取用户 ID 或电子邮件地址?
- javascript - 有人会如何减少 Nuxt 页面的数量?
- c# - 我应该使用什么类型的企业架构师 API 创建组件实例?
- android - 邮箱 | 谷歌播放服务 | 登录 Gsuit 时无法通过 URL Scheme 打开其他应用程序
- c# - .NET 5 Web 服务器:无法建立 SSL 连接
- keycloak - 钥匙斗篷 | 重定向到身份提供者后如何获得超时事件