トラブルシューティング
- 一般
- Visual Studio ビルドまたは MSBuild のエラー
- Dotfuscator でインポートするものがインストールされていますか?
- 問題は Dotfuscator で発生していますか?
- より多くの情報の入手
- DotfuscatorIncludeAsInput のエラーと警告
- .NET Core および .NET Standard のビルド エラー
- Dotfuscator 処理エラー
- Dotfuscator が参照アセンブリを見つけられませんか?
- Dotfuscator が ilasm/ildasm を見つけられません
- Dotfuscator スタック トレースの取得
- DotfuscatorAndroidSigningCertFingerprint エラー
- 誤検知 Xamarin 改ざんチェック
- アクティブ化エラー
- ランタイム エラー
- 保護の強化
- ビルド エージェント
一般
最新バージョンの Dotfuscator を使用していますか?
既に修正されている問題が発生する可能性があります。
サード パーティ製のアセンブリはすべて難読化の対象から除外されていますか?
サード パーティ製のアセンブリを含んでいるパッケージを処理する場合は、一般的に、サード パーティ製アセンブリ自体は難読化しないことをお勧めします。 このようなサード パーティ製のアセンブリを除外する方法については、パッケージ アセンブリを処理から除外する/処理に含めるを参照してください。
MSBuild ターゲットを介して Visual Studio プロジェクトに Dotfuscator を統合している場合には除外が自動的に行われることに注目してください。
Visual Studio ビルドまたは MSBuild のエラー
このセクションでは、アプリケーションの保護に関する手順を実行する場合など、Visual Studio または MSBuild プロジェクトが Dotfuscator の MSBuild ターゲットを使用しているときに発生する問題について説明します。
Dotfuscator でインポートするものがインストールされていますか?
次のようなステートメントを使用して、プロジェクト ファイル(.csproj
)で MSBuild ターゲットをインポートする場合は、
<Import Project="...\PreEmptive.Dotfuscator.Common.targets"/>
プロジェクトが Visual Studio で読み込まれ MSBuild でビルドされる前に、MSBuild ターゲット ファイルをインストールしておく必要があります。
開発者環境を使用する場合は、インストール手順に従い、忘れずに、Visual Studio のインストレーションの Visual Studio 統合機能を有効にしてください。
ビルド エージェントでビルドしている場合、Dotfuscator の最適なインストール方法については、ビルド エージェントの考慮事項を参照してください。
問題は Dotfuscator で発生していますか?
Dotfuscator を有効にしないプロジェクトの構成を作成します。 エラーが続く場合は、問題が Dotfuscator 以外のもので発生している可能性があります。
より多くの情報の入手
「Dotfuscator は失敗または終了し、エラー コードが出力された」という旨の一般的なエラーが表示された場合に、より多くの情報を入手するには、次の手順を実行します。
Visual Studio(または MSBuild の
/v
スイッチ)を使ってビルドの出力の詳細を標準(以上の詳細レベル)に設定することで、プロジェクトのビルド出力の中で Dotfuscator のビルド出力を確認するDotfuscator 構成ファイル内でビルドの進行状況設定値を "詳細な情報を表示する" に設定することで、Dotfuscator からの追加出力を確認する
DotfuscatorIncludeAsInput のエラーと警告
このセクションでは DotfuscatorIncludeAsInput
プロジェクト プロパティおよびメタデータによって発生する一般的なエラーと警告について説明します。
この機能の使用方法の詳細については、保護するアセンブリの制御を参照してください。
アセンブリ "X.dll" への参照には、競合する 'DotfuscatorIncludeAsInput' メタデータが含まれています。
2 つの
Reference
項目が、DotfuscatorIncludeAsInput
の異なる値を持つ同一のアセンブリを参照する場合にこのエラーが発生します。 たとえば、プロジェクト ファイル A には次が含まれます。<Reference Include="ExternalAssembly"> <HintPath>..\path\to\the\assembly\ExternalAssembly.dll</HintPath> <!-- Dotfuscator への入力として含まれるアセンブリ --> <DotfuscatorIncludeAsInput>true</DotfuscatorIncludeAsInput> </Reference>
一方、プロジェクト ファイル B には次が含まれます。
<Reference Include="ExternalAssembly"> <HintPath>..\path\to\the\assembly\ExternalAssembly.dll</HintPath> <!-- Dotfuscator への入力として含まれないアセンブリ --> <DotfuscatorIncludeAsInput>false</DotfuscatorIncludeAsInput> </Reference>
このような場合、"競合する 'DotfuscatorIncludeAsInput' メタデータ" エラーが生成されます。
この問題を解決するには、アセンブリを保護する必要があるかどうかを判断し、問題となっている
DotfuscatorIncludeAsInput
メタデータの値を、どこで参照されても正しい値に変更する必要があります。'X.csproj' を (直接的または間接的に) 参照するプロジェクトのうち、'DotfuscatorIncludeAsInput' プロパティを 'false' に設定しているものもあれば、設定していないものもあります。
この警告が発生するのは、プロジェクトが、保護されたアセンブリおよび難読化の対象から除外されたアセンブリの両方で参照されたときです。
たとえば、保護されているプロジェクト A と保護されてないプロジェクト B があり、その両プロジェクトがプロジェクト C を参照するとします。 プロジェクト C は保護されたプロジェクトによって参照されるので、既定では Dotfuscator によってプロジェクト C が保護されます。 ただし、名前変更が有効になっていると、プロジェクト B からプロジェクト C への参照では問題が発生する可能性があります。なぜなら、プロジェクト B は名前変更されているメソッドやプロパティを参照しようとするからです。
すべての問題を回避するには、共有プロジェクトに対してライブラリ モードを有効にするか、または共有プロジェクトを Dotfuscator から除外します。
<!-- In ProjC.csproj --> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <DotfuscatorIncludeAsInput>false</DotfuscatorIncludeAsInput> </PropertyGroup> </Project>
プロジェクト 'ProjA.csproj' の ProjectReference '..\ProjB\ProjB.csproj' に DotfuscatorIncludeAsInput が設定されましたが、Dotfuscator は ProjectReference 項目のこのメタデータを使用しません。
このエラーは、
DotfuscatorIncludeAsInput
メタデータをProjectReference
項目へ追加したときに発生します。 現在、この機能はサポートされません。 プロジェクトを保護の対象から除外するには、ProjectReference
項目からDotfuscatorIncludeAsInput
メタデータを削除します。<!-- In ProjA.csproj --> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <ProjectReference Include="...\path\to\ProjectFile.csproj"> <!-- 次の行を削除します: --> <DotfuscatorIncludeAsInput>false</DotfuscatorIncludeAsInput> </ProjectReference> </ItemGroup> </Project>
次に、参照されたプロジェクトで、
DotfuscatorIncludeAsInput
プロパティをすべてのPropertyGroup
要素へ追加します。<!-- In ProjB.csproj --> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <!-- 次の行を追加します: --> <DotfuscatorIncludeAsInput>false</DotfuscatorIncludeAsInput> </PropertyGroup> </Project>
プロジェクト 'Proj.csproj' の PackageReference 'PackageName' に DotfuscatorIncludeAsInput が設定されましたが、本バージョンの Dotfuscator は、NuGet パッケージを入力として含めることをサポートしていません。
このエラーは、
DotfuscatorIncludeAsInput
メタデータをPackageReference
項目へ追加したときに発生します。 参照される NuGet パッケージから生成されたアセンブリを保護することは現在サポートしていません。PackageReference
項目からDotfuscatorIncludeAsInput
メタデータを削除してください。<!-- In Proj.csproj --> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <PackageReference Include="PackageName" Version="1.2.3"> <!-- 次の行を削除します: --> <DotfuscatorIncludeAsInput>true</DotfuscatorIncludeAsInput> </PackageReference> </ItemGroup> </Project>
メモ: Visual Studio プロジェクトで NuGet パッケージを作成している場合、そのプロジェクトに Dotfuscator の MSBuild ターゲットを統合することはできるので、アセンブリは NuGet パッケージにパッケージ化される前に保護されます。
.NET Core および .NET Standard のビルド エラー
error MSB4019: The imported project "C:\Program Files\dotnet\sdk\2.1.504\PreEmptive\Dotfuscator\4\PreEmptive.Dotfuscator.Common.targets" was not found.Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
error MSB4062: The "FindProjectAssemblies" task could not be loaded from the assembly C:\SomePath\PreEmptive\Dotfuscator\4\PreEmptive.Dotfuscator.Internal.Tasks.dll.Could not load file or assembly 'Microsoft.Build.Utilities.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.The system cannot find the file specified.Confirm that the declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask.
これらのエラーは、.NET Core コマンド(dotnet build
/ dotnet msbuild
/ dotnet publish
)を使用していると同時に、Dotfuscator が Visual Studio プロジェクト ファイルに統合されている場合に発生します。Windows 上の Visual Studio および MSBuild は、Dotfuscator を使用してこのようなプロジェクトを保護できますが、.NET Core コマンドは現在サポートされていません。詳細については、アプリケーションの保護を参照してください。
Dotfuscator 処理エラー
このセクションでは、アプリケーションが Dotfuscator で処理されるときに発生する問題について説明します。
Dotfuscator が参照アセンブリを見つけられませんか?
- コマンド ラインから
/v /e /bindlog=true
オプションを指定して実行し、Dotfuscator が探し回る場所について追加情報を取得します。 - 見つからなかったパスをユーザー定義のアセンブリ ロード パスに追加します。Dotfuscator の XML 構成ファイル、または Dotfuscator 構成エディターの[設定]タブで追加できます。
Dotfuscator が ilasm/ildasm を見つけられません
Loading C:\Sample\SampleApp.exe
アセンブリ C:\Sample\SampleApp.exe で実行するための ildasm の互換バージョンが見つかりませんでした。 このアセンブリは .NET Framework v4.0.30319 でビルドされています。
ビルド エラーです。
詳細表示モードで Dotfuscator を実行していた場合は、次のような警告に似た警告を見ているかもしれません。
警告: ツールの調査中に無効なパスを検出しました。該当するパスは "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\x64\" と ildasm.exe でした。エラーは '"Illegal characters in path."(パスに無効な文字が含まれています。) でした。無視して検索を続行します。詳細については、"toollog" という名前の構成プロパティを定義して、Dotfuscator を再実行してください。
Dotfuscator でこれらのツールの検索の際に生じる問題について、詳しい情報を得るためにログを有効にするには、
Dotfuscator を再起動し、toollog
という構成プロパティ(値は何でも構いません)を使って詳細表示モードでビルドを実行します。
コマンド ラインから引数 /v /p:toollog=true
を使って実行するか、または構成エディターの[設定]タブで[ビルドの進行状況]を構成し、プロパティを追加することもできます。
ビルドからログ出力を見直した後に、この問題を修正する手立てがわからない場合は、サポートにお問い合わせください。
Dotfuscator スタック トレースの取得
Dotfuscator でエラーが発生した場合は、コマンド ラインから /v /e
オプション付きで実行することにより、Dotfuscator のスタック トレースを取得します。
DotfuscatorAndroidSigningCertFingerprint エラー
エラー : 改ざんチェックを Xamarin Android アプリケーションに差し込むには、署名証明書の SHA-1 フィンガープリントを指定する必要があります。
MSBuild プロパティの DotfuscatorAndroidSigningCertFingerprint をこの値に設定してください。
このエラーは、アプリケーションへの署名に使用する証明書の SHA-1 フィンガープリントを指定することで修正できます。 この値を指定する方法は 2 つあります。
- MSBuild ターゲット ファイルを使用して Dotfuscator と統合している場合は、Xamarin Android アプリケーションのプロジェクト ファイルにある
DotfuscatorAndroidSigningCertFingerprint
プロパティの値を設定します。 ご自分のプロジェクト ファイルでこのプロパティを設定する場所の例については、「アプリケーションの保護」ページにある Xamarin セクションを参照してください。
別の方法で Dotfuscator と統合している場合、Dotfuscator 構成エディターで AndroidSigningCertFingerprint
という新たな構成プロパティに値を設定します。
誤検知 Xamarin 改ざんチェック
Xamarin 改ざんチェックをテストしているときに、アプリケーションが改ざんされていないときでも常に改ざんされているかのように応答する場合は、DotfuscatorAndroidSigningCertFingerprint
がアプリへの署名に使用する証明書の SHA-1 フィンガープリントと一致することを確認します。
また、既定のキーストアの証明書を使用している場合は、SHA-1 フィンガープリントはホストによって異なるため、あるホストのフィンガープリントを使って DotfuscatorAndroidSigningCertFingerprint
の値を構成してから、別のホストでビルドすると、アプリケーションが常に改ざんされたように見えます。
既定のキーストア証明書を使用し続けたい場合は、アプリケーションがビルドされるホスト上で、既定のキーストア証明書の SHA-1 フィンガープリントを使って DotfuscatorAndroidSigningCertFingerprint
が構成されるようにする必要があります。
アクティブ化エラー
このセクションでは、Dotfuscator をアクティブ化するときに発生する問題について説明します。
Dotfuscator がアクティブ化されていません
コマンド ライン ビルドを実行するためには、Dotfuscator Professional を登録する必要があります。Dotfuscator 構成エディターを実行して、ライセンス キーを入力してください。
当コンピューターで Dotfuscator をアクティブ化していない場合は、このエラーが発生します。 詳細については、アクティブ化を参照してください。
以前に使用されたシリアル番号
This serial number (...) has previously been used to register. Please contact support@preemptive.com for registration assistance or to purchase additional licenses.
Dotfuscator をアクティブ化しようとしたとき、お客様のライセンスが追加コンピューターでのアクティブ化を許可しないものである場合には、このエラーが発生します。
このエラーが自動ビルドのログに示されている場合は、DOTFUSCATOR_LICENSE
環境変数または引数を使用して、Dotfuscator をアクティブ化している可能性があります。
動的にプロビジョニングされたビルド エージェントでビルドを実行する場合は、ビルド ジョブごとに新しいコンピューターをライセンスに登録します。
このような場合は、フローティング ライセンスを使用する必要があります。他の種類のライセンスでは、上記のエラーが発生します。
ライセンスの詳細については、PreEmptive Solutions にご連絡ください。
インターネット接続の問題
アクティブ化サーバー "..." への到達に関する問題があります。このライセンスの種類は、ビルドする前に PreEmptive アクティブ化サーバーへのアクセスを必要とします。PreEmptive サポートにお問い合わせください。
エラー: このライセンスのサブスクリプションを確認できませんでした。"..."このライセンスの種類は、ビルドする前に PreEmptive サブスクリプション サーバーへのアクセスを必要とします。PreEmptive サポートにお問い合わせください。
これらのエラーは、フローティング ライセンスを使用してアクティブ化したりビルドを実行したりする場合に、PreEmptive Solutions のサーバーへの接続に関するネットワーク問題が原因で発生します。 このような場合は、インターネット接続が必要です。Dotfuscator はエラーを発行する前に一度、失敗した接続を再試行します。
ランタイム エラー
一般的なアドバイス
大部分のアプリケーションは、保護しても、追加されたすべてのチェックを禁止することで、保護されていないバージョンと同じ動作を行います。 ただし、Dotfuscator による難読化によってランタイム エラーが発生するケースがあります。 このようなケースのうち、一部は Dotfuscator のスマート難読化機能の静的分析によって検出できますが、残りのケースを検出するには手動による構成が必要です。
ランタイム エラーは通常、名前の変更による難読化に関係しています。 たとえば、メソッドの名前が含まれる文字列をコードでリフレクション API に渡す場合、この呼び出しは保護を行った後では失敗する可能性があります。その理由は、そのメソッドが Dotfuscator によって名前変更されたのに、その文字列に依然として古い名前が含まれているためです。 この場合、そのメソッドを名前の変更対象から除外するように Dotfuscator を構成することができます。 ランタイム エラーを発見して名前変更からの適切な除外を適用するケース スタディを、名前変更の対象除外の特定で参照してください。
似たエラー/問題が発生するのは、Dotfuscator の除去機能が有効になっているのに、静的分析では実行時に使用されるコードの一部を認識できない場合です。 この種の問題を解決するには、保護されたアセンブリ内の特定のメソッドを常に名前の変更対象にするように Dotfuscator を構成します。
どの変換が問題を起こしていますか?
どの変換が問題の原因となっているかを調査します。
- すべての難読化の変換がオフになっている場合、それは機能しますか?
- すべての入力アセンブリでライブラリ モードが有効になっている場合、それは機能しますか?
- すべての入力アセンブリで XAML の変換がオフになっている場合、それは機能しますか?
- 実行時エラーはほとんどの場合、名前の変更に関係しています。
- 依存するプロパティ:そのプロパティとすべてのバッキング メソッドは、名前の変更対象から除外されていますか?
- プロパティの対象除外のあらゆる状況に対応できるカスタム規則で機能しますか?
<type name=".\*" regex="true"> <propertymember name=".\*" regex="true"/> </type>
アプリケーションは正しく署名/登録されていますか?
詳細については、Dotfuscator の構成エディターの概要に関するページの署名に関するセクションをお読みください。
[警告]タブのチェック
[警告]タブにあるすべての警告を確認しましたか?
Dotfuscator のビルドで警告が発生した場合は、構成エディターの下部にある[ビルド出力]セクションにおいて、警告が独自のタブに表示されます。
実行時の例外のキャッチ
実行時の例外をキャッチし、それをメッセージ ボックスに表示して、実際に何が間違っているかを確認します。
保護の強化
Dotfuscator の保護を強化する方法の詳細については、保護の強化を参照してください。
なぜ、こんなに少しのものしか名前が変更されなかったのでしょうか?
アセンブリがライブラリ モードになっている場合、Dotfuscator は、そのアセンブリの公開され利用できるインターフェイスの一部であるものついては、名前を変更しません。
次のような場合には、ライブラリ モードをオフにすることができます。
- アセンブリが、他のアセンブリからライブラリとして利用できるように作られていない場合
- または、ライブラリとそのすべての依存アセンブリを同じ Dotfuscator 構成で一緒に処理する場合
なぜ、設定した変換が実行されないのでしょうか?
変換タブ([名前の変更]、[制御フロー]、[文字列の暗号化]など)のいずれかを開いて、変換のオプションを構成し、Dotfuscator 構成を作成しても、変換の効果があるように見えないことがあります。
これは、変換自体がオフになっている可能性があります。
- [設定]タブを開きます。
- 左側のナビゲーション パネルで[グローバル オプション]を選択します。
- 右側のパネルで[機能]セクションを調べます。
ビルド エージェント
ソリューションから NuGet パッケージの復元
Dotfuscator を Azure Pipelines ビルドに統合した後に、ビルド ステップの 1 つが失敗するようになる可能性があります。 これにより、NuGet パイプライン ステップが成功しているとしても、NuGet がソリューションのパッケージを正常に復元できない問題が生じる可能性があります。 問題が生じているかどうかを確認するには、NuGet Restore パイプライン ステップのコンソール出力を展開して、次のエラー メッセージを探します。
error MSB4019: The imported project "PreEmptive.Dotfuscator.Common.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
この場合、MSBuild は Dotfuscator ターゲット ファイルを見つけることができず、プロジェクトの依存関係の一覧を生成する前に終了します。 この問題を解決するには、ビルド サーバー上の、Dotfuscator ターゲット ファイルの場所で、MSBuild を提供する必要があります。
NUGET_RESTORE_MSBUILD_ARGS
環境変数を使用して、正しい場所を MSBuild へ渡すことができます。
このようにするには、次の環境変数を Azure Pipelines ジョブへ追加します。
- 名前:
NUGET_RESTORE_MSBUILD_ARGS
- 値:
/p:DotfuscatorMSBuildDir="<install dir>\PreEmptive.Protection.Dotfuscator.Pro\tools\msbuilddir"
<install dir>
はビルド サーバー上の Dotfuscator ターゲット ファイルのパスです。
Azure Pipelines の変数の詳細については、Microsoft のドキュメントを参照してください。 ビルド エージェントでの Dotfuscator の使用についての詳細は、ビルド エージェントの該当セクションを参照してください。