MSBuild にフックすることで、Xamarin Studio で Xamarin Android プロジェクトを .NET Reactor で問題なく難読化することができました。次のマークアップを csproj ファイルの末尾に追加します。
<Target Name="AfterCompile">
<Exec Command=""C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -file "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -targetfile "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -suppressildasm 1 -obfuscation 1 -stringencryption 1 -antitamp 1 -control_flow_obfuscation 1 -flow_level 9 -resourceencryption 1 -mono 1 -exception_handling 1" Condition="'$(ConfigurationName)' == 'Release'" />
</Target>
</Project>
Visual Studio 2015 で Xamarin にアップグレードすると、これは機能しなくなりました。「エラー MSB4018: "LinkAssemblies" タスクが予期せず失敗しました。」
**編集 Ajitが指摘したように、PostBuildをtrueに設定し、代わりに「PostBuildEvent」イベントにフックすることで、「LinkAssemblies」タスクエラーを回避しました。
ただし、難読化された DLL は apk ファイルに追加されません。.apk ファイルを解凍し (ファイル拡張子を .zip または .rar に変更するだけ)、内部の DLL ファイルを逆コンパイルすることで、これをテストしました。難読化されていませんでした。
bin/Release フォルダーと obj/Release フォルダーを調べたところ、そこにある DLL は難読化されています。しかし、何らかの理由で、apk の DLL は難読化された DLL ではありません。
おそらく、apk ファイルを作成するプロセスで PostBuildEvent が遅すぎますか?
これが私の現在の設定です:
PostBuild を true に設定します。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
...
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
</PropertyGroup>
そして、'AfterCompile' の代わりに 'PostBuildEvent' イベントにフックします。
<Target Name="PostBuildEvent">
<Exec Command=""C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -file "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -targetfile "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -suppressildasm 1 -obfuscation 1 -stringencryption 1 -antitamp 1 -control_flow_obfuscation 1 -flow_level 9 -resourceencryption 1 -mono 1 -exception_handling 1" Condition="'$(ConfigurationName)' == 'Release'" />
</Target>
</Project>
** 更新 VS 2015 で単純な空の Android プロジェクトを作成して、プロジェクトの複雑さが問題の原因であるかどうかをテストしました (サードパーティ コントロールの使用、ソリューションの 2 番目のプロジェクトとしての共通ユーティリティ ライブラリなど)。「LinkAssemblies」エラーは引き続き発生するため、おそらく私の環境/セットアップです。
私は GitHub アカウントを持っていますが、アプリをダウンロードしていないため、プロジェクト フォルダー構造全体をアップロードできませんでした。そのため、ソリューション全体を圧縮してアップロードしました。ここから入手できます:
https://github.com/nbcruz/TestObfuscate/blob/master/TestObfuscate.zip
GitHub が許可する 25 MB 未満の zip ファイルを作成するには、78 MB のファイルがあったため、obj/Debug フォルダーの内容を削除する必要がありました。
.NET Reactor プロジェクトは、bin\Release\ フォルダー内にあります。手動で実行し、難読化された DLL を bin\Release\TestObfuscate_Secure フォルダー内に作成します。obfuscate.bat ファイルも bin\Release\ フォルダー内にあり、基本的には bin\Release\TestObfuscate_Secure フォルダー内の DLL を bin\Release\ フォルダーにコピーするだけです。この空の単純なソリューションでも、「LinkAssemblies」エラーがスローされます。