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