我按照此处描述的步骤将Dotfuscator 集成到我的 Xamarin.Android 项目中,但是当需要构建项目时,我收到以下错误:
"_DotfuscatorXamarin_DetermineDefaultInputsTask"任务意外失败。 2>\path\to\Preempptive.Dotfuscator.Xamarin.targets(570,5):错误MSB4018:System.NullReferenceException:对象引用未设置为对象的实例。 2>\path\to\Preempptive.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\Preempptive.Dotfuscator.Xamarin.targets(570,5): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() 2>\path\to\Preempptive.Dotfuscator.Xamarin.targets(570,5): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.d__26.MoveNext()
我在网上看了又看,但似乎没有人遇到这个问题。我认为问题与在第一次构建时生成默认配置文件有关。有什么想法吗?
更新:此问题已在较新版本的 Dotfuscator 中修复。请参阅免费的Dotfuscator Community和商业许可的Dotfuscator Professional的详细说明。原始答案如下。
完全披露:我是PreEmptive Solutions的Dotfuscator开发人员,并且正在以该角色回答这个问题。
你是对的,问题是目标文件(PreEmptive.Dotfuscator.Xamarin.targets
)中的默认配置文件生成 - 对此感到抱歉。具体而言,生成集成正在尝试发现项目引用,但需要经典的 MSBuild 项目格式,而不是 .NET Standard 使用的新最小格式。
您可以变通解决此问题,如下所示:
- 在目标文件中,找到
_DotfuscatorXamarinConfigTemplateLines
属性并将其值(在 CDATA 部分内)复制到与项目文件位于同一目录中的名为DotfuscatorConfig.xml
的新文件(或为项目文件中的DotfuscatorXamarinConfigFileName
属性提供的任何值)。 - 在 Visual Studio 中,在要保护的配置中生成项目一次(例如,AnyCPU|发布)。它会出错,因为新的配置文件还没有任何输入程序集,但是通过现在构建,我们可以将这些程序集放在正确的位置来配置 Dotfuscator。
- 打开 Dotfuscator 的用户界面。
- 对于社区版,从 Visual Studio 中打开"工具"菜单并选择"抢占保护 - Dotfuscator"。
- 对于专业版,请从"开始"菜单运行 Dotfuscator 专业版。
- 在用户界面中,"文件"|"打开在步骤 1 中创建的文件。 在"输入">
- 屏幕上,单击"添加输入"按钮(社区版中的绿色加号,专业版中的文件夹打开图标)。 浏览到
- 项目目录,然后浏览到
objReleaseDotfuscatorXamarindfin
,然后选择要保护的程序集。- 将
Release
替换为您在步骤 2 中构建的配置的相应目录。 - 应选择与解决方案中的项目对应的程序集,而不是选择属于框架一部分的第三方程序集和程序集。
- 将
- 保存配置文件。
- 导航到"项目属性"编辑器。
- 在社区版中,转到">生成设置"屏幕,然后选择"项目属性"选项卡。
- 在专业版中,转到"设置"选项卡,然后选择">设置>项目属性"屏幕。
- 添加以下项目属性(社区版和专业版的说明):
- 属性名称
InDir
、值objReleaseDotfuscatorXamarindfin
- 属性名称
OutDir
、值objReleaseDotfuscatorXamarindfout
- 属性名称
ReportDir
、值DotfuscatorReportsRelease
- 将
Release
替换为您在步骤 2 中构建的配置的相应目录。请注意,磁盘上尚不存在OutDir
和ReportDir
指向的目录。
- 属性名称
- 保存配置文件。
- 返回输入屏幕,选择一个输入,然后单击铅笔图标。将程序集的路径从绝对路径编辑为
${configdir}${InDir}AssemblyName.dll
,用AssemblyName.dll
替换程序集的实际名称和扩展名。对每个输入程序集重复此操作。 - 保存配置文件(并将其提交到源代码管理)。
- 在 Visual Studio 中重新生成项目。构建集成将使用您的配置文件,而不是尝试生成新的配置文件。
在乔的奇妙解决方案之上,我最终根据 https://www.preemptive.com/dotfuscator/pro/userguide/en/getting_started_xamarin.html#pctoc-setup 指令将一个值从真更改为假 让我的安卓解决方案构建/运行。
<DotfuscatorXamarinGenerateNewConfigFile>false</DotfuscatorXamarinGenerateNewConfigFile>
我一直在根据本用户指南在 Xamarin.Android 项目中配置 Dotfuscator 社区版。我也有以下构建错误(与@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:UsersuserAppDataLocalTempwqhfhbsk.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:VSProjectsdotFuscatorTestPreEmptive.Dotfuscator.Xamarin.targets 570
我已经使用@Joe Sewell的完整披露解决了这个问题。 我希望先发制人的解决方案能够尽快实现固定版本!!
在某些时候,我在项目的根目录中丢失了Preempptive.Dotfuscator.Xamarin.target文件。我已经执行了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:UsershietaAppDataLocalTempk3a5f2bj.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
仅供参考,如果其他人可以避免浪费时间。