[除去]エディターには、設定用の 3 つのタブがあります。
- [対象トリガー]タブは、コードを安全に除去できるかどうかを判断できるよう、アプリケーションのエントリ ポイントを Dotfuscator に指示するために使用します。
- [条件付き対象]タブは、リフレクションなどの特殊なケースのために、完全に除去してはいけない型について Dotfuscator に指示するために使用します。
- [除去]エディターの[オプション]タブは、除去レポートを構成する場合に使用します。
対象選択トリガーと条件付き対象の理解
Dotfuscator は、アプリケーションを静的に分析して、実際には使用されていない要素を判断し、それらの要素を出力バイナリから削除することができます。これにより、アプリケーションのサイズを縮小できます。
静的分析ではコード全体を調べ、"トリガー" またはエントリー ポイントと呼ばれる一連のメソッドから分析を開始します。 通常、外部アプリケーションによって呼び出されることが予期されるメソッドは、トリガーとして定義されている必要があります。 たとえば、単純なスタンドアロン アプリケーションでは、Main
メソッドがトリガーとして定義されます。 1 つのアセンブリに複数のトリガーを定義することができます。
Dotfuscator は、各トリガー メソッドのコード全体を調べ、使用されているフィールド、メソッド、型を記録します。 その後、呼び出されているメソッドを同様の方法で分析します。 この処理は、呼び出されているメソッドがすべて分析されるまで続けられます。 この処理が終了した時点で、アプリケーションの実行に最低限必要な型とそのメンバーのセットを判別できます。 出力アセンブリには、これらの型だけが含まれます。
Dotfuscator は、ある特定のメソッド(リフレクション / XAML など)が呼び出されていることを見分けられない場合、実行時に必要とされるものを削除しようとすることがあります。 これを回避するには、対象トリガーを設定し、どのクラスのメンバー(メソッド、プロパティ、フィールド、イベント)を静的分析のための "エントリー ポイント" として扱う必要があるかを Dotfuscator に伝えます。 Dotfuscator は、それらのメンバーとメンバーのすべての子孫をコール グラフに保持します。
しかしながら、ときに、これは最適な動作ではありません。 次のようなアプリケーションを考えてみましょう。リフレクションを使用して一連の型を読み込み、それらをインターフェイスにキャストした後、そのインターフェイスでメソッドを呼び出す、つまり、本質的にはプラグイン モデルのアプリケーションです。 Dotfuscator の静的分析は、読み込まれる可能性のある型を識別しようとはしませんが、そのインターフェイスでどのメソッドを呼び出そうとしているかはわかります。
このような場合は、条件付き選択対象として型を設定する必要があります。 Dotfuscator はそれらを対象として選択し、それらがインターフェイスを実装することを把握します。 インターフェイスのメソッドの一部が使用されていないと判断した場合は、それらのメソッドをインターフェイスから、および条件付きで対象として選択される型のすべての実装から除去します。 除去されなかったメソッドはさらに、通常どおり除去するかどうか分析されます。
[対象トリガー]タブ
[対象トリガー]タブでは、除去処理でアプリケーション エントリ ポイント("トリガー")として使用するすべてのメソッドをグラフィカルに指定できます。
アプリケーションのツリー ビューを参照し、対象として選択する項目の隣にあるチェック ボックスをオンにして、特定のメソッドをエントリ ポイントとして選択できます。 また、対象となる複数のメソッドを選択するための、独自のカスタム規則をビジュアルに作成することもできます。
規則の結果をプレビューし、作成した対象選択規則を微調整できます。 アプリケーションのツリー ビューでは、対象として選択されたすべての項目が網掛け表示されます。 すべての規則を適用した場合の効果をプレビューすることも、選択した特定の規則の効果だけをプレビューすることもできます。
対象選択規則および対象除外規則の使用に関する詳細については、規則エディターを参照してください。
[条件付き対象]タブ
[条件付き対象]タブでは、条件付きで除去処理の対象として選択するすべての型をグラフィカルに指定できます。 この機能の詳細については、対象選択トリガーと条件付き対象の理解を参照してください。
アプリケーションのツリー ビューを参照して、対象として選択する項目の隣にあるチェック ボックスをオンにして、条件付きで特定の型を対象として選択できます。 また、対象となる複数の型を選択するための、独自のカスタム規則をビジュアルに作成することもできます。
規則の結果をプレビューし、作成した対象選択規則を微調整できます。 アプリケーションのツリー ビューでは、対象として選択されたすべての項目が網掛け表示されます。 すべての規則を適用した場合の効果をプレビューすることも、選択した特定の規則の効果だけをプレビューすることもできます。
対象選択規則および対象除外規則の使用に関する詳細については、規則エディターを参照してください。
[組み込み規則]タブ
Dotfuscator の[除去]エディターの[組み込み規則]タブには、対象トリガー規則と条件付き対象規則が表示されます。 これらの標準規則は、特定のアプリケーションの種類またはテクノロジに適用されます。 規則はそれぞれ解説文を持っており、自身が選択されたときにそれをフォームに表示します。 組み込み規則は対応するチェック ボックスをオンにすることによって適用できます。
それぞれの規則の正確な定義は、インストール先の Common
サブディレクトリに記載されています。 この場所の典型的な例は、C:\Program Files (x86)\PreEmptive Protection Dotfuscator Professional A.B.C\Common
です。 この規則定義については、dotfuscatorReferenceRule
で始まる XML ファイルを参照してください。
[オプション]タブ
[除去]エディターの[オプション]タブは実行する削除の種類を選択するのに使用します。
[リテラルのみ削除]を選択すると定数宣言のみの削除を実行します。 [使用されていないメタデータとコードを削除]を選択すると、定数定義を削除するだけでなく、通常のアルゴリズムに従って使用されていないメソッドおよびフィールドを判定して削除します。
定数のみ除去
アセンブリで不要コードを除去するよう設定したくはないが、一方で危険回避やアセンブリ サイズの削減を目的に除去を行いたいという状況に直面することもあるでしょう。 このような場合、「定数のみ除去」は理想的な妥協点です。 Dotfuscator は定数のみ除去の実行時、入力アセンブリから定数宣言(const フィールド)のみを除去します。 未使用の型、メソッドおよびフィールドは検出せず、それらは出力アセンブリに反映されます。
定数のみ除去は、不要コードを完全に除去することが望ましくないような状況で行うのがよいでしょう。 .NET コンパイラはコンパイル時に、コード内の const フィールドへの参照を、そのフィールドの実際の値で置き換えます。 定数宣言はアセンブリにそのまま残り、外部アセンブリによる参照やリフレクションを介したアクセスがサポートされます。 これらの状況をサポートする必要がない場合は、一般的に定数のみ除去を有効にするのがよいでしょう。
除去レポート
Dotfuscator は、すべての入力アセンブリの一覧と、それらがどのように除去されたかを示すレポートを XML 形式で生成します。 各アセンブリ一覧には、型とそれらのメンバー(メソッド、フィールド、プロパティなど)の一覧と共に、その項目が除去されたかどうかを示す属性が表示されます。 また、レポートには、各アセンブリにアタッチされているマネージ リソースの除去状況も記載されます。 最後にレポートは、不要なコードの除去による全体的な効果に関する統計セクションを提供します。
除去レポートは、既定の変換(または独自の変換)を使用して HTML 形式に変換すると、非常に有益なレポートになります。 既定の変換では、ブラウズ可能な相互参照レポートが生成され、除去された項目が赤色で示されます。
除去レポートの要素は割り当てファイルの要素と似ています。 以下に、注意する必要のある点を示します。
- レポートには型、メソッド、フィールド、プロパティ、およびマネージ リソースの除去状態が含まれています。
- 型が除去された場合は、当然、そのメンバー(メソッド、フィールド、およびプロパティ)もすべて除去されています。
- 型名では、入れ子になったクラスの名前は "/" 文字で親と区切られます。
- コンストラクターには
.ctor
という名前が付けられますが、(静的初期化子、クラス コンストラクターなどとも呼ばれる)静的コンストラクターには.cctor
という名前が付けられます。