Dotfuscator 在 Xamarin.Android 项目上抛出错误

Dotfuscator throwing error on Xamarin.Android project

我按照 here 所述的步骤将 Dotfuscator 集成到我的 Xamarin.Android 项目中,但是在构建项目时,我收到以下错误:

The "_DotfuscatorXamarin_DetermineDefaultInputsTask" task failed unexpectedly. 2>\path\to\PreEmptive.Dotfuscator.Xamarin.targets(570,5): error MSB4018: System.NullReferenceException: Object reference not set to an instance of an object. 2>\path\to\PreEmptive.Dotfuscator.Xamarin.targets(570,5): error MSB4018: at InlineCode._DotfuscatorXamarin_DetermineDefaultInputsTask.Execute() in \path\to\AppData\Local\Temp\eruovv3u.0.cs:line 106 2>\path\to\PreEmptive.Dotfuscator.Xamarin.targets(570,5): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() 2>\path\to\PreEmptive.Dotfuscator.Xamarin.targets(570,5): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.d__26.MoveNext()

我在网上看了又看,但似乎没有人遇到这个问题。我认为问题与在第一次构建时生成默认配置文件有关。有什么想法吗?

更新:此问题已在较新版本的 Dotfuscator 中修复。免费查看详细说明Dotfuscator Community and for the commercially-licensed Dotfuscator Professional。原始答案如下。


完全披露:我是 PreEmptive Solutions 的 Dotfuscator 开发人员,我正在以该角色回答这个问题。

你说得对,问题是目标文件 (PreEmptive.Dotfuscator.Xamarin.targets) 中的默认配置文件生成 - 很抱歉。具体来说,构建集成试图发现项目引用,但需要经典的 MSBuild 项目格式,而不是 .NET Standard 使用的新的最小格式。

您可以按如下方式解决此问题:

  1. 在目标文件中,找到 _DotfuscatorXamarinConfigTemplateLines 属性 并将其值(在 CDATA 部分内)复制到名为 DotfuscatorConfig.xml 的新文件(或您为DotfuscatorXamarinConfigFileName 属性 在你的项目文件中)在与你的项目文件相同的目录中。
  2. 在 Visual Studio 中,在您要保护的配置中构建您的项目一次(例如,AnyCPU|Release)。它会出错,因为新的配置文件还没有任何输入程序集,但通过现在构建,我们将这些程序集放在正确的位置以配置 Dotfuscator。
  3. 打开 Dotfuscator 的用户界面。
    • 对于社区版,从 Visual Studio 开始,打开工具菜单和 select PreEmptive Protection - Dotfuscator。
    • 对于专业版,运行 从“开始”菜单选择 Dotfuscator 专业版。
  4. 在用户界面中,文件 |打开 在步骤 1 中创建的文件。
  5. 在“输入”屏幕上,单击 "Add Input" 按钮(社区版中的绿色加号,专业版中的文件夹打开图标)。
  6. 浏览到您的项目目录,然后 obj\Release\DotfuscatorXamarin\dfin,然后 select 您要保护的程序集。
    • Release 替换为您在步骤 2 中构建的配置的适当目录。
    • 您应该 select 与解决方案中的项目相对应的程序集,而不是 select 属于框架一部分的第三方和程序集。
  7. 保存配置文件。
  8. 导航到项目属性编辑器。
    • 在社区版中,转到构建设置屏幕和select项目属性选项卡。
    • 在专业版中,转到设置选项卡和select设置 > 项目属性屏幕。
  9. 添加以下项目属性(说明for Community Edition, and for Professional Edition):
    • 属性 名称 InDir, 值 obj\Release\DotfuscatorXamarin\dfin
    • 属性 名称 OutDir, 值 obj\Release\DotfuscatorXamarin\dfout
    • 属性 名称 ReportDir, 值 DotfuscatorReports\Release
    • Release 替换为您在步骤 2 中构建的配置的适当目录。请注意,OutDirReportDir 指向的目录尚不存在于磁盘上.
  10. 保存配置文件。
  11. Return 到输入屏幕和 select 输入并单击铅笔图标。将程序集的路径从绝对路径编辑为 ${configdir}${InDir}\AssemblyName.dll,用 AssemblyName.dll 替换程序集的实际名称和扩展名。对每个输入程序集重复。
  12. 保存配置文件(并将其提交给源代码管理)。
  13. 重建 Visual Studio 中的项目。构建集成将使用您的配置文件,而不是尝试生成新配置文件。

我一直在根据 this user guide 在 Xamarin.Android 项目中配置 Dotfuscator Community Edition。而且我还有以下构建错误(与@AxiomaticNexus 几乎相同):

    Error       The "_DotfuscatorXamarin_DetermineDefaultInputsTask" task failed unexpectedly.
System.NullReferenceException: Object reference not set to an instance of an object.
   at InlineCode._DotfuscatorXamarin_DetermineDefaultInputsTask.Execute() in c:\Users\user\AppData\Local\Temp\wqhfhbsk.0.cs:line 106
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() eKey.Droid  C:\VSProjects\dotFuscatorTest\PreEmptive.Dotfuscator.Xamarin.targets    570

我已经使用@Joe Sewell 的完全披露 解决了这个问题。 希望PreEmptive Solutions尽快发布修复版本!!!

在某些时候,我在项目的根目录中丢失了文件 PreEmptive.Dotfuscator.Xamarin.targets。我已经执行了 Joe Sewell 描述的上述说明,但后来发现丢失了文件。

错误是这样的:

    Error       The "_DotfuscatorXamarin_DetermineDefaultInputsTask" task failed unexpectedly.
System.NullReferenceException: Object reference not set to an instance of an object.
   at InlineCode._DotfuscatorXamarin_DetermineD  efaultInputsTask.Execute() in c:\Users\hieta\AppData\Local\Temp\k3a5f2bj.0.cs:line 106
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() WorkSafe.Droid      

如果其他人可以避免浪费时间,仅供参考。

除了 Joe 出色的解决方案之外,我最终根据 https://www.preemptive.com/dotfuscator/pro/userguide/en/getting_started_xamarin.html#pctoc-setup 上的说明将一个值从 true 更改为 false 让我的 android 解决 build/run.

    <DotfuscatorXamarinGenerateNewConfigFile>false</DotfuscatorXamarinGenerateNewConfigFile>