【问题标题】:Dotfuscator throwing error on Xamarin.Android projectDotfuscator 在 Xamarin.Android 项目上引发错误
【发布时间】:2018-03-14 02:46:56
【问题描述】:

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

“_DotfuscatorXamarin_DetermineDefaultInputsTask”任务意外失败。 2>\path\to\PreEmptive.Dotfuscator.Xamarin.targets(570,5):错误 MSB4018:System.NullReferenceException:对象引用未设置为对象的实例。 2>\path\to\PreEmptive.Dotfuscator.Xamarin.targets(570,5): 错误 MSB4018: 在 InlineCode._DotfuscatorXamarin_DetermineDefaultInputsTask.Execute() 在 \path\to\AppData\Local\Temp\eruovv3u.0.cs:line 106 2>\path\to\PreEmptive.Dotfuscator.Xamarin.targets(570,5):错误 MSB4018:在 Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() 2>\path\to\PreEmptive.Dotfuscator.Xamarin.targets(570,5): 错误 MSB4018: 在 Microsoft.Build.BackEnd.TaskBuilder.d__26.MoveNext()

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

【问题讨论】:

  • 我在 PreEmptive 工作,为了最好地评估问题,我有两个问题:(1) 您使用的是哪个版本的目标文件?文件中的第一个注释将列出其版本;最新的是 1.1.0。 (2) 您是否引用了任何 .NET Standard(或 .NET Core)库?
  • @JoeSewell (1) 目标文件中的第一条评论指出:“MSBuild 版本 1.1.0 的 Dotfuscator-Xamarin 集成文件”。所以我假设我使用的是最新版本。 (2) 另外,Xamarin.Android 项目在同一个解决方案中引用了一个 .NET Standard 1.4 类库项目。

标签: xamarin.android dotfuscator


【解决方案1】:

更新:此问题已在较新版本的 Dotfuscator 中得到修复。请参阅免费Dotfuscator Community 和商业许可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 的用户界面。
    • 对于 Community Edition,从 Visual Studio 打开工具菜单并选择 PreEmptive Protection - Dotfuscator。
    • 对于 Professional Edition,请从“开始”菜单运行 Dotfuscator Professional Edition。
  4. 在用户界面中,文件 |打开在步骤 1 中创建的文件。
  5. 在“输入”屏幕上,单击“添加输入”按钮(社区版中的绿色加号,专业版中的文件夹打开图标)。
  6. 浏览到您的项目目录,然后选择obj\Release\DotfuscatorXamarin\dfin,然后选择您要保护的程序集。
    • Release 替换为您在第 2 步中构建的配置的相应目录。
    • 您应该选择与解决方案中的项目相对应的程序集,而不是选择第三方和属于框架一部分的程序集。
  7. 保存配置文件。
  8. 导航到项目属性编辑器。
    • 在 Community Edition 中,转到 Build Settings 屏幕并选择 Project Properties 选项卡。
    • 在专业版中,转到设置选项卡并选择设置>项目属性屏幕。
  9. 添加以下项目属性(指令for Community Editionfor Professional Edition):
    • 属性名称InDir,值obj\Release\DotfuscatorXamarin\dfin
    • 属性名称OutDir,值obj\Release\DotfuscatorXamarin\dfout
    • 属性名称ReportDir,值DotfuscatorReports\Release
    • Release 替换为您在第 2 步中构建的配置的相应目录。请注意,OutDirReportDir 指向的目录尚不存在于磁盘上。
  10. 保存配置文件。
  11. 返回输入屏幕并选择一个输入并单击铅笔图标。将程序集的路径从绝对路径编辑到${configdir}\${InDir}\AssemblyName.dll,用AssemblyName.dll 替换程序集的实际名称和扩展名。对每个输入程序集重复此操作。
  12. 保存配置文件(并将其提交到源代码管理)。
  13. 在 Visual Studio 中重建项目。构建集成将使用您的配置文件,而不是尝试生成新的。

【讨论】:

  • 做到了。感谢您的详细说明。
  • @user6675963 我相信他指的是旧版本的 Dotfuscator 用户界面。属性部分实际上不是一个选项卡,它实际上位于左侧面板的“输入”项下方。
  • @Joe Sewell,你是大师。它按预期工作.. 谢谢!
【解决方案2】:

在乔的奇妙解决方案之上,我最终根据https://www.preemptive.com/dotfuscator/pro/userguide/en/getting_started_xamarin.html#pctoc-setup 上的说明将一个值从 true 更改为 false 让我的 android 解决方案构建/运行。

    <DotfuscatorXamarinGenerateNewConfigFile>false</DotfuscatorXamarinGenerateNewConfigFile>

【讨论】:

    【解决方案3】:

    我一直在根据this user guide 在 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:\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 的 Full Disclosure 解决了这个问题。 我希望 PreEmptive Solutions 能尽快修复修复版本!!!

    【讨论】:

      【解决方案4】:

      在某些时候,我在项目的根目录中缺少文件 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      
      

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

      【讨论】:

        猜你喜欢
        • 2021-03-13
        • 2020-09-15
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 2019-06-17
        • 2017-09-07
        • 2018-06-29
        • 1970-01-01
        相关资源
        最近更新 更多