Dotfuscator 構成ファイルには、指定したアプリケーションがどのように保護されるかについての情報が含まれています。 構成ファイルは dotfuscator_v2.5.dtd
(またはそれ以前のもの)に準拠する XML ドキュメントで、通常はファイル拡張子が .xml
です。
このページでは Dotfuscator の構成ファイルの書式、さまざまな構成オプションについて詳しく説明します。 テキスト エディターで構成ファイルを編集するときには、このページをガイダンスとしてお使いください。 構成ファイルを扱う方法はほかにもあり、 たとえば、Windows で構成エディターを使って構成ファイルを編集する、または MSBuild ターゲットやコマンド ライン インターフェイスを使って構成ファイルを生成することができます。
バージョン
.xml ファイルの Version 属性は必須情報であり、ご利用になる Dotfuscator のバージョンに適合している必要があります。 Version 属性は、準拠する DTD のバージョン番号に一致する必要があります。 Dotfuscator のある時点のリリースは、以前のバージョンから変更されていない構成ファイルを使用できるように設計されています。 たとえば、Version 1.0 の構成ファイルを使用して Dotfuscator 1.1 を実行できます。このとき、構成ファイルを編集する必要はありません。
バージョン:
<dotfuscator version="2.2">
プロパティ リストとプロパティ
<propertylist>
(プロパティ リスト)セクションは省略可能であり、構成ファイルで後から利用される可能性のある(<プロパティ>
と呼ばれる)変数の定義および値の代入を行うことができます。 このセクションで定義したプロパティ定義は、構成プロパティと呼ばれます。
構成プロパティ:
<!-- 拡張可能なプロパティを定義します -->
<!-- 省略可能 -->
<propertylist>
<property name="name" value="myapp"/>
<property name="outdir" value="c:\myapp\out"/>
</propertylist>
変数またはプロパティ参照は、このセクション内で定義しなくても、構成ファイル内で使用することはできます。 たとえば、コマンド ラインで変数を定義したり、環境変数を利用することができます。 プロパティは、次のアルゴリズムを使用してそのプロパティに関連付けられた値を検索し、文字列の置き換えを行うことによって機能します。
- 外部のプロパティ リストで値を確認します。
- 見つからない場合は、プロパティと同じ名前の環境変数を確認します。
- それでも見つからない場合は、構成ファイルの propertylist セクションに構成の定義がないかどうかをチェックします。
- それでも見つからない場合は、値に空の文字列を使用します。
外部のプロパティは、-p
オプションを使用して、コマンド ラインから渡されます。 組み込みの外部プロパティには次の 3 つがあります。
-
applicationdir
:Dotfuscator のインストール ディレクトリを表します。 -
appdatadir
:Dotfuscator のローカル データ ディレクトリを表します。 -
configdir
:構成ファイルが存在するディレクトリを示します。
プロパティは、構成ファイルの作成に役立ちます。この構成ファイルは、複数のアプリケーションや同じアプリケーションのさまざまなバージョン、あるいはさまざまなビルド環境間での移植を容易にするテンプレートとしての役割を果たします。 プロパティは、次の構文で参照されます。
プロパティの構文:
${property_name}
プロパティ参照は大文字と小文字を区別するので、${OutDir}
は ${outdir}
とは異なるプロパティを参照します。 プロパティ値は、ほかのプロパティ値を参照することがあります。 現在、プロパティの参照は、<file>
要素の dir
属性または name
属性の値としてのみ使用でき、構成ファイルのどの場所でも使用できるわけではありません。 <file>
要素を使用するセクションの一覧は以下のとおりです。
- inputassembly
- mapinput
- mapoutput
- output
- tempdir
- assembly
- removalreport
- transform
- key
- loadpaths
- program
- filelist
- smartobfuscationreport
- pfx
プロパティ参照は、構成ファイル内のその他の場所では文字どおりに解釈されます。
プロパティ参照の使用例:
<output>
<file dir="${testdir}/output"/>
</output>
グローバル オプション セクション
グローバル オプション セクションは、実行全体にわたって適用する構成オプションを定義するためにあります。 このセクションでは、各オプションについて詳しく説明します。このセクションは必須ではありません。
入力管理
入力管理には、manual
(既定値)と automatic
の 2 つのモードがあります。 このオプションは、処理する入力を Dotfuscator で決定する方法を制御します。
manual
は、Dotfuscate タスクが MSBuild から呼び出されたときに InputAssemblies プロパティからの入力と構成ファイルに列挙された入力をマージすることを指定します。 このマージは、Dotfuscate が呼び出されるたびに行われますが、構成ファイルを変更するものではありません。
automatic
は、Dotfuscate タスクが MSBuild から呼び出されたときに InputAssemblies プロパティに指定された入力のみを使用することを指定します。 構成ファイルに指定された入力は無視されます。 Dotfuscate タスクの一環として、構成ファイルは、タスクに指定された入力内容を反映するよう自動的に更新されます。 このため、Dotfuscator 構成エディターで構成ファイルを開いた場合は、MSBuild によって判別された直近の入力に照らして構成を変更することができます。
この設定に関係なく、ビルド時に Dotfuscate タスクに指定された Properties のプロパティ値は、構成ファイルに指定されたプロパティ値と(ビルド時に)マージされます。 ただし、Properties は保存されません。
automatic
の値は、Dotfuscate
MSBuild タスクでのみ使用できます。 automatic
を有効にした場合には、Dotfuscator 構成エディターやコマンド ラインでビルドを行うことはできなくなります。automatic
の場合には、リンクはサポートされません。入力管理設定:
<global>
<input_management>automatic</input_management>
</global>
library オプション
このオプションは Dotfuscator 3.0 で非推奨となり、 個々の入力アセンブリに対して適用できる、より詳細な library オプションに置き換えられました。 Dotfuscator が旧バージョンの構成ファイルを読み込んだ場合にも、このオプションは有効なものとして処理されますが、構成エディターでその構成ファイルを保存すると、新しいオプションが使用されます。 アセンブリ単位のライブラリ モードを参照してください。
library オプション:
<global>
<!-- オプションを設定します -->
<option>library</option>
</global>
Verbose、Quiet、Investigate オプション
これらのオプションは、対応するコマンド ライン オプションと同じであり、構成ファイルまたはコマンド ラインを使って有効にすることができます。 コマンド ラインからオプションの設定を解除する方法はありません。
Verbose、Quiet、Investigate オプション:
<global>
<!-- 詳細表示モードで実行します -->
<option>verbose</option>
<!-- メッセージ非表示モードで実行します -->
<option>quiet</option>
<!-- 調査のみを実行して割り当てファイルを生成します -->
<option>investigate</option>
</global>
SuppressIldasm グローバル オプション
このオプションを設定することにより、Microsoft の ILdasm ユーティリティがアセンブリ IL を表示しないよう Dotfuscator に指示します。 また、このオプションを有効にすると、"Navigate to Decompiled Sources"(逆コンパイルされたソースへの移動)機能を使って、Visual Studio がソース コードを逆コンパイルできないようにします。 これは .NET 2.0 以上を対象とするアセンブリにのみ有効です。
SuppressIldasm グローバル オプション:
<global>
<option>suppressildasm</option>
</global>
NuGet から取得する IL ツールを強制的に使用する
このオプションは、.NET Framework をターゲットとするアセンブリに対して、Windows でローカルにインストールされた .NET Framework の ILasm/ILdasm ツールではなく、NuGet を介して取得した ILasm/ILdasm ツールを優先して使用します。
このオプションは、Dotfuscator が Windows 上で実行されている場合のみ適用され、それ以外の場合は無視されます。この理由は、Windows 以外では、使用されるこれらの IL ツールが常に NuGet を介して取得されるからです。
Dotfuscator では、.NET Framework をターゲットとするアセンブリの難読化には、force_nuget_tools
オプションを指定しない限り、ローカルにインストールされている .NET Framework の ILasm および ILdasm ツールが使用されます。.NET Core や .NET 5.0 以降などの他のターゲットでは、Dotfuscator はどのオペレーティング システムでも NuGet を介して ILasm/ILdasm ツールを取得するため、それらのターゲットについてはこのオプションは無視されます。
<global>
<option>force_nuget_tools</option>
</global>
デバッグ オプション
Dotfuscator では、下記のオプションのいずれかを設定することで、出力アセンブリと一緒にデバッグ シンボルを生成させることができます。 これらのオプションは、コマンド ラインでの -debug
スイッチや構成エディター内のデバッグ シンボルの出力オプションに相当します。
構成ファイルのグローバル オプション | コマンド ライン スイッチ | 構成エディターの説明 |
---|---|---|
(なし) | (なし) または -debug:off
|
なし |
DebugAuto |
-debug:auto |
自動的に入力アセンブリに基づく |
Debug (非推奨) |
-debug:on |
JIT 最適化なし。PDB のシーケンス ポイント (非推奨) |
DebugImpl (非推奨) |
-debug:impl |
JIT 最適化なし。MSIL のシーケンス ポイントト (非推奨) |
DebugOpt (非推奨) |
-debug:opt |
JIT 最適化。MSIL のシーケンス ポイント (非推奨) |
Pdb (非推奨) |
-debug:pdb |
JIT 最適化。PDB のシーケンス ポイント (非推奨) |
デバッグ シンボルには、ソース ファイルのパス、ローカルの変数名、および行番号などの情報が含まれています。 通常、これらはアセンブリと同じディレクトリで個別の PDB ファイルに格納されます。 デバッガーはデバッグ時にこの情報を使用してブレーク ポイントを設定し、式の値を特定します。
デバッグ オプションの 1 つを有効にすると、入力アセンブリの既存のデバッグ シンボルを読み込み、Dotfuscator によって行われる変更を反映するために更新されたデバッグ シンボルを生成します。 その後、元のソース コードに対してアプリケーションのデバッグを続行し、難読化されたコードにブレーク ポイントを設定できます。 これらの設定は各アセンブリにアタッチされている DebuggableAttribute
にも作用します。これは、たとえば、JIT(ジャストインタイム)最適化を無効にするなど、デバッグを可能にする方法を .NET ランタイムに指定します。
デバッグ オプションが何も設定されないと、Dotfuscator は入力アセンブリ用にシンボルがあっても、出力アセンブリ用のデバッグ シンボルを生成しません。 入力アセンブリにある DebuggableAttribute
のインスタンスは出力アセンブリからは削除されます。
DebugAuto オプション
DebugAuto
オプションを使用すると、入力アセンブリのシンボルと同じ形式で、対応する出力アセンブリの更新済みデバッグ シンボルを自動的に作成します。
<global>
<option>debugauto</option>
</global>
この設定は、各入力アセンブリで存在するシンボルの種類に応じて、移植可能な PDB(Portable PDB) または元の .NET Framework 形式の PDB を生成できます。
入力アセンブリに、関連付けられているデバッグ シンボルがない場合、Dotfuscator は対応する出力シンボルを生成しません。
入力アセンブリに DebuggableAttribute
があると、それは "そのまま" 出力アセンブリに保持されます。
この設定は、.NET Core や .NET Standard アセンブリなど、mscorlib
アセンブリを参照しないアセンブリをサポートします。
この設定は .NET 1.0 または 1.1 をターゲットとするアセンブリはサポートしません。 その場合は、Debug
を使用してください。
Debug、DebugImpl、DebugOpt、および Pdb オプション
Dotfuscator では、これら 4 つのオプションそれぞれが、元の .NET Framework PDB 形式ですべての出力アセンブリ用のデバッグ シンボルを作成します。
<!-- PDB ファイルを作成し、
DebuggableAttribute を次のように設定:
JIT 最適化を無効にし
PDB ファイルのシーケンス ポイントを使用 -->
<global>
<option>debug</option>
</global>
<!-- PDB ファイルを作成し、
DebuggableAttribute を次のように設定:
JIT 最適化を無効にし
アセンブリの IL の暗黙のシーケンス ポイントを使用-->
<global>
<option>debugimpl</option>
</global>
<!-- PDB ファイルを作成し、
DebuggableAttribute を次のように設定:
JIT 最適化を有効にし
アセンブリの IL の暗黙のシーケンス ポイントを使用-->
<global>
<option>debugopt</option>
</global>
<!-- PDB ファイルを作成し、
DebuggableAttribute を設定しない。ランタイムの既定値は次のとおり:
JIT 最適化は有効で、
PDB ファイルのシーケンス ポイントを使用 -->
<global>
<option>pdb</option>
</global>
これらの設定では、移植可能な PDB を使用する入力アセンブリでも、生成するのは 元の .NET Framework 形式の PDB のみです。
入力アセンブリに、関連付けられているデバッグ シンボルがない場合、Dotfuscator では高水準のソース言語(C# など)ではなく、.NET 中間言語(IL)に基づくソース ファイルと行番号情報で出力シンボルを生成します。
入力アセンブリにある DebuggableAttribute
は削除されます。 設定に応じて、新しい DebuggableAttribute
がアセンブリに追加され、その意味を上の XML コメントで説明します。
これらの設定がサポートされるのは、mscorlib
アセンブリを参照するアセンブリのみです。 これらのオプションのいずれかが指定され、入力アセンブリ(.NET Core または .NET Standard アセンブリなど)が mscorlib
を参照しない場合、その出力アセンブリにはデバッグ シンボルが含まれず、DebuggableAttribute
のインスタンスはすべて削除されます。
DebugImpl
、DebugOpt
、および Pdb
オプションは、.NET 2.0 以上を対象とするアンブリに対してサポートされます。 これらのオプションのいずれかが指定され、入力アセンブリが以前のバージョンの .NET を対象としている場合、その出力アセンブリにはデバッグ シンボルが含まれず、DebuggableAttribute
のインスタンスはすべて削除されます。
NoDotfuscatorAttribute オプション
Dotfuscator は既定値では、処理するアプリケーションに DotfuscatorAttribute
という名前のカスタム属性を挿入します。 この属性には、プログラムの難読化に使用する Dotfuscator のバージョンに関する情報が格納されます。この情報には製品 ID(Community あるいは Professional)とバージョン番号があります。
DotfuscatorAttribute
を挿入したくない場合は、nodotfuscatorattribute
という構成ファイルにあるオプションを手動で設定することで無効にすることができます。
NoDotfuscatorAttribute オプション:
<global>
<option>nodotfuscatorattribute</option>
</global>
MonoCompat オプション
Dotfuscator の変換のうち .NET Framework や .NET Core 向けのアプリケーションの保護に有用なものもありますが、Mono 上での(Xamarin および MAUI アプリケーションなどの)実行時にはランタイム エラーが発生する可能性があります。 これらの変換を無効にするには、monocompat
グローバル オプションを設定します。
<global>
<option>monocompat</option>
</global>
このグローバル オプションは、構成エディターの Mono 互換の変換のみを使用する設定に該当します。 この設定を "はい" にすると、グローバル オプションが構成ファイルに表示されるようになります。
構成エディターで構成ファイルを新規作成したときには、このグローバル オプションは存在しないので、保護されたアプリケーションは Mono 互換ではありません。
MSBuild ターゲットで構成ファイルを新規作成したときには、このグローバル オプションが存在するので、保護されたアプリケーションは Mono 互換です。
入力アセンブリ リスト
入力アセンブリ リストには、難読化するアセンブリおよび/またはパッケージのファイル名とディレクトリを含めます。 また、パッケージまたはアセンブリ レベルで設定する構成オプションもここに含めます。
複数のモジュールから成るアセンブリの場合は、マニフェストを持つモジュールだけを含めます。
入力アセンブリ リスト:
<input>
<asmlist>
<inputassembly>
...
<file dir="c:\temp" name="myproj.dll"/>
</inputassembly>
...
</asmlist>
</input>
アセンブリ単位のライブラリ モード
入力アセンブリにライブラリ モードを指定するには、その入力アセンブリの <inputassembly>
要素に library
オプションを追加します。
<inputassembly>
<option>library</option>
...
</inputassembly>
アセンブリ単位の宣言による難読化
宣言による難読化の有効化と無効化
入力アセンブリに対する宣言による難読化を有効にするには、その入力アセンブリの <inputassembly>
要素に honorOAs
オプションを追加します。
<inputassembly>
<option>honoroas</option>
...
</inputassembly>
難読化属性の除去
入力アセンブリに対する難読化属性の除去を有効にするには、その入力アセンブリの <inputassembly>
要素に stripOA
オプションを追加します。
<inputassembly>
<option>stripoa</option>
...
</inputassembly>
アセンブリ単位のチェック処理
Dotfuscator では、特定の入力アセンブリ用のチェックのコードの差し込みを制御することができます。 このオプションの設定が及ぼす影響については、[チェック]エディターの説明ページの該当セクションで説明します。
チェックが有効になっている場合、Dotfuscator はチェック属性を受け取り、不要なチェック属性を出力アセンブリから除去します。 既定の動作は、次のオプションの一方または両方を指定することにより、入力アセンブリ レベルで変更できます。
-
nohonorsos
は、アセンブリで宣言されたチェック属性を Dotfuscator が処理できないようにします。 -
nostripsos
は、チェック属性の処理後、アセンブリからそれらの不要な属性を Dotfuscator が除去しないようにします。
アセンブリ単位のチェック処理:
<inputassembly>
<!-- チェック属性を除去しません -->
<option>nostripsos</option>
<!-- チェック属性を使用しません -->
<option>nohonorsos</option>
...
</inputassembly>
アセンブリ単位の XAML の変換モード
この設定は、特定の入力アセンブリに次のマークアップを含めることができることを Dotfuscator に示します。そのマークアップは、ユニバーサル Windows アプリケーションで用いられる XAML、あるいは Windows Presentation Foundation アプリケーションで用いられるコンパイル済みの XAML リソース(BAML)です。いずれのマークアップも、名前変更のために分析され対象に加えられます。 Dotfuscator で処理するため、変換されるマークアップは要素の分離コード参照とともに名前変更される識別子を持ちます。 マークアップ リソースから参照されるプロパティは、そのプロパティ メタデータは保持されますが、名前が変更されます。
入力アセンブリに XAML の変換モードを指定するには、その入力アセンブリの <inputassembly>
要素に <option>
要素を追加します。
アセンブリ単位の XAML の変換モード:
<inputassembly>
<option>transformxaml</option>
<file dir="c:\temp" name="myproj.dll"/>
</inputassembly>
ユーザー定義のアセンブリ ロード パス
入力アセンブリ内で使用している型の情報を知るためには、入力アセンブリによって参照されるアセンブリを読み込む必要があります。 Dotfuscator は、Visual Studio や CLR 自体で使用される規則に類似した検索規則を使用します。
既定値の検索規則では参照されるアセンブリが見つからない場合のために、検索するディレクトリを追加指定する手段が用意されています。 Dotfuscator はアルゴリズムの最終ステップとして、これらのディレクトリを指定された順序で検索します。 ただし、追加オプション([設定]タブの[アセンブリ ロード パス]にある[最初に検索]チェック ボックス)が使用されていると、Dotfuscator はその標準検索を適用する前にロード パスから検索します。
ユーザー定義のアセンブリ ロード パスを XML 構成ファイルに追加するには、次のようにします。
ユーザー定義のアセンブリ ロード パスの追加:
<input>
<loadpaths>
<option>prepend</option>
<file dir="C:\temp" />
...
</loadpaths>
....
</input>
出力ディレクトリ
これは、出力アセンブリが書き込まれるディレクトリです。 アプリケーションは無条件に、このディレクトリにあるファイルを常に上書きします。
出力ディレクトリ:
<!-- 出力先ディレクトリが必要です -->
<output>
<file dir="c:\work"/>
</output>
一時ディレクトリ
このセクションは省略可能であり、Dotfuscator の作業ディレクトリを指定します。 指定しない場合、既定値であるシステムの一時ディレクトリが作業ディレクトリになります。 アプリケーションは、作業ディレクトリを使用して入力アセンブリで ILdasm および ILasm を実行します。 逆アセンブルされた出力は、入力アセンブリに埋め込まれたすべてのリソースと共に、このディレクトリに格納されます。 これらのファイルは、処理の終了後、自動的に削除されます。
一時ディレクトリ:
<!-- 一時ディレクトリは省略可能です -->
<!-- 指定しない場合はシステムの一時ディレクトリが既定値として使用されます -->
<tempdir>
<file dir="c:\temp"/>
</tempdir>
難読化属性の機能割り当て
機能割り当ては、宣言による難読化のための機能です。 Dotfuscator の「宣言による難読化」のサポートの詳細については、カスタム属性を使用した宣言による難読化を参照してください。 このセクションでは、機能割り当てについて説明し、Dotfuscator が認識するネイティブな機能文字列を紹介します。
構成ファイル内の <obfuscationattributemap>
要素は、難読化属性の feature プロパティから取得した文字列を、Dotfuscator が認識する 1 つ以上の機能文字列に割り当てる場所です。
これらの割り当ては、XML 構成ファイル内で次のように指定します。
難読化属性の機能割り当て:
<obfuscationattributemap>
<feature name="testmode">renaming, controlflow</feature>
</obfuscationattributemap>
名前の変更セクション
名前の変更セクションでは、ユーザーは入力割り当てファイルおよび出力割り当てファイルの場所や、名前の変更から項目を除外するための詳細な規則など、名前の変更に固有のオプションを指定できます。
名前の変更セクションは省略可能です。 このセクションが存在しない場合は、以下の既定の処理が適用されます。
- 既定の名前の変更が行われます(名前空間は削除されます)。
-
lowalpha
の名前変更規則を使って新しい名前が選択されます。 - 割り当てファイルは増分難読化の読み取りを行いません。
- 割り当てファイルは {CurrentWorkingDir}/Dotfuscator/Map.xml に書き込まれます。
- アプリケーションの種類に従って行われる対象除外以上の除外は行われません。
「識別子の名前の変更」セクションでは、名前の変更オプション、割り当てファイル、およびカスタム対象除外について詳しく説明します。 以下のセクションでは、それぞれの概要を説明します。
名前の変更規則
Dotfuscator では、難読化処理時に識別子の名前を生成するためのアルゴリズムがいくつか定義されており、その中から選んで使用できます。
-
Low Alpha:これは、Dotfuscator のすべてのバージョンにおける名前の変更規則の既定値で、小文字の英文字を使用します。
{a,b,c,...}
-
Upper Alpha:この規則では、大文字の英文字を使用します。
{A,B,C,...}
-
Numeric:この規則では、数字だけを使用します。
{0,1,2,...}
- Unprintable:この規則では、Unicode の上位部分にある印字不能文字群を使用します。
名前の変更規則は、<renaming>
要素の属性として指定します。 使用できる値は、lowalpha
、upperalpha
、numeric
、または unprintable
です。
名前の変更規則:
<renaming scheme="unprintable">
...
</renaming>
名前の変更オプション
disable
オプションを使用すると、名前の変更セクションの残りの部分の内容に関係なく、Dotfuscator は名前の変更をまったく行いません。
名前の変更の無効オプション:
<renaming>
<!--本セクションの残り部分を無視し、名前の変更処理をスキップします-->
<option>disable</option>
...
</renaming>
Dotfuscator には、名前の変更アルゴリズムが名前空間
を処理する方法を決定するためのオプションがいくつか用意されています。 すなわち、"keepnamespace
" と "keephierarchy
" です。これらについては、識別子の名前の変更で詳しく説明します。
Dotfuscator では、難読化された型名に対し、既定値の文字列またはユーザー指定の文字列をプレフィックスとして付加するように指定できます。 この機能を使用する場合は、prefix
オプションを指定します。 詳細については、名前の変更プレフィックスを参照してください。
名前の変更プレフィックス機能の有効化:
<renaming>
<!-- 次の設定により、名前変更のプレフィックス機能が有効になります -->
<option>prefix</option>
...
</renaming>
Dotfuscator では、戻り値の型を使用する拡張オーバーロード誘導も使用できます。 この機能を有効にするためのオプションは enhancedOI
です。このオプションについては、オーバーロード誘導によるメソッドの名前の変更で詳しく説明します。
拡張オーバーロード誘導の適用:
<renaming> <!-- 拡張オーバーロード誘導を適用します-->
<option>enhancedOI</option>
...
</renaming>
拡張オーバーロード誘導は、既定では、シリアル化可能とマークされているクラスには適用されません。 シリアル化可能な型も含め、すべての型に拡張オーバーロード誘導を適用したい場合は、enhancedOIOnSerializables
オプションを使用します。
拡張オーバーロード誘導シリアル化可能オプションの適用:
<renaming>
<!-- シリアル化可能な型にも拡張オーバーロード誘導を適用します-->
<option>enhancedOIOnSerializables</option>
...
</renaming>
XML シリアライザーと互換性のある方法で型やメンバーの名前を変更するように、名前の変更アルゴリズムを変更することができます。
名前の変更アルゴリズムを変更して XML シリアライザーとの互換性を保つ:
<renaming>
<!-- XML シリアル化の互換性-->
<option>xmlserialization</option>
...
</renaming>
詳細については、XML シリアル化と名前の変更を参照してください。
keepManagedResourceNames
オプションを使用すると、マネージ リソースの名前が変更されないようにすることができます。このオプションについては、クラスの名前の変更オプションで詳しく説明します。
<renaming>
<!-- このオプションでマネージ リソースの名前が変更されないようにします -->
<option>keepManagedResourceNames</option>
...
</renaming>
<randomizeRenaming>
オプションを使用すると Dotfuscator は非直線的な順序で新しい名前を割り当てます。 このため、英小文字の名前を {a, b, c, d,...} の順で割り当てるのではなく、{u, p, k, f,...} のように割り当てます。 このオプションは名前の変更規則で動作します。
名前のランダムな割り当てを使用する
<renaming>
<!-- 名前のランダムな割り当てを使用する -->
<option>randomizeRenaming</option>
...
</renaming>
名前の変更の対象除外リスト
このセクションは、入力アセンブリの名前変更を動的に微調整する方法を提供します。 このセクションには、実行時に適用される "対象除外規則" のリストを含めることができます。 規則で特定のクラス、メソッド、フィールド、プロパティ、またはイベントを選択した場合、その項目の名前は変更されません。
- これらの規則は、library オプションなどのグローバル オプションが暗黙に適用される規則と共に適用されます。
- 各規則は論理的に
OR
で結合されるため、1 つでも規則にマッチした項目の名前は変更されません。 - 対象除外リストは、型、メソッド、フィールド、プロパティ、イベント、アセンブリ、モジュール、または名前空間による名前の除外をサポートしています。
- 各種規則については、識別子の名前の変更で詳しく説明します。
名前の変更の参照規則
参照規則を使用すると、外部ファイルから規則をインポートして、構成間で共有できるようになります。 Dotfuscator の組み込みの名前の変更規則は、これを使用して Dotfuscator の Common
ディレクトリ(Dotfuscator インストール ディレクトリと同じ場所にある)から規則をインポートします。 規則は rulekey
属性で参照されます。値には、参照される規則に定義した GUID を指定します。
参照規則リスト:
<referencerulelist>
<referencerule rulekey="{0D471A86-E98F-4493-849B-85BD4CC884A1}"/>
<referencerule rulekey="{C9D9BF84-4F0D-4e9f-B3EC-3038235AE741}"/>
</referencerulelist>
出力割り当てファイル
この機能は、特定の実行中に Dotfuscator が使用したすべての名前の変更割り当てのログを作成します。 これは、統計セクションも提供します。
このオプションを指定することで、Dotfuscator の名前の変更機能に対し、名前の変更がどのように行われたかを追跡記録するよう指示できます。その結果、ユーザーは名前の変更状況をすぐに調査できるほか、今後 Dotfuscator を実行する際に入力として使用することができます。 このオプションで作成されるファイルは、その後増分入力ファイル オプションで使用されます。
このファイルを不注意で失ってしまうと、将来のアプリケーションの増分更新の機会を失う可能性があります。 そのため、このファイルを適切にバックアップしておくことが非常に重要になります。 このような理由から、Dotfuscator は(同じ名前の)既存のファイルが検出された場合には、自動的にそのファイルの名前を変更してから、新しい割り当てファイルで既存の割り当てファイルを上書きするようになっています。
Dotfuscator に既存の割り当てファイルの名前を自動的に変更させないように指示するには、構成ファイルに overwrite="true"
という属性を設定します。
割り当てファイルの形式については、識別子の名前の変更で説明します。
属性を上書きに設定する:
<renaming>
...
<mapping>
<mapoutput overwrite="true">
<file dir="c:\work" name="testout.xml"/>
</mapoutput>
</mapping>
</renaming>
HTML 形式の名前の変更レポート
出力割り当てファイルは、本来は解析向きの XML ドキュメントとしてフォーマットされます。 名前の変更レポートを判読可能にするために、出力割り当てファイルを HTML 形式のドキュメントに変換するよう指示することができます。 Dotfuscator は、あらかじめ定義されている XSL ドキュメントを出力割り当てファイルに適用することにより、変換処理を実施します。 既定の HTML レポートが好みでない場合は、任意で、変換に使用する XML ドキュメントに独自のものを指定できます。 出力レポートは、XML 形式の割り当てファイルと同じディレクトリに置かれます。 ファイル名は XML ファイルと同じで、拡張子が .xml
ではなく .html
になります。
HTML 形式の名前の変更レポート:
<renaming>
...
<mapping>
<mapoutput overwrite="true">
<file dir="c:\work" name="testout.xml"/>
<transform>
<!-- 独自の XSL ファイルの指定は任意です -->
<file dir="c:\mytransforms" name="map.xsl"/>
</transform>
</mapoutput>
</mapping>
</renaming>
入力割り当てファイル
Dotfuscator では、入力割り当てファイルによって、前回の Dotfuscator の実行で作成された名前をインポートすることができます(「増分難読化」として知られている処理です)。 Dotfuscator はクラス、メソッド、およびフィールドの名前を、入力割り当てファイルに示されている名前に変更するように最善の努力をします。
<mapinput>
要素に入力割り当てファイルを指定できます。 この要素には任意の obfuscatereferences
属性もありますが、記述しなければ既定値である "true
" になります。 この属性は、入力割り当てファイルに含まれているが、入力アセンブリのセット内には定義されていない名前を Dotfuscator でどのように処理するかを制御します。 true の場合、現在の入力アセンブリのセット内にこのような名前への参照があれば、その名前は変更されます。
入力割り当てファイル:
<renaming>
...
<mapping>
<mapinput obfuscatereferences="true">
<file dir="c:\work" name="testin.xml"/>
</mapinput>
</mapping>
</renaming>
制御フローの難読化セクション
制御フロー セクションでは、制御フローの難読化から項目を除外するための詳細な規則など、制御フローの難読化に固有のオプションを指定できます。
制御フロー セクションは省略可能です。 このセクションが存在しない場合、制御フローの難読化は無効になります。
制御フローの難読化レベル
制御フローの難読化のレベルは、"low
"(低)、"medium
"(中)、"high
"(高)という 3 つの値のいずれかに設定されます。 これらのレベルは、Dotfuscator の制御フローの難読化アルゴリズムの強力さに対応します。 一般に、レベルが高いほど難読化はより強力になりますが、それと引き換えにコード サイズは増加し、パフォーマンスが低下します。 これは、制御フローの難読化が強力であればあるほど、より多くの分岐命令をコードに追加することになるからです。
制御フローの難読化のレベルは、難読化されるすべてのメソッドに対しグローバルに適用されます。
制御フローの難読化オプション
disable
オプションを使用すると、制御フロー セクションの残りの部分の内容に関係なく、Dotfuscator は制御フローの難読化をまったく行いません。
制御フローの無効オプション:
<controlflow level="high">
<!-- 本セクションの残り部分を無視し、制御フローの難読化処理をスキップします-->
<option>disable</option>
...
</controlflow>
制御フローの対象除外リスト
このセクションは、入力アセンブリの制御フローの難読化を動的に微調整する方法を提供します。 このセクションには、実行時に適用される "対象除外規則" のリストを含めることができます。 規則で特定のクラスまたはメソッドを選択すると、その項目は制御フローの難読化の対象になりません。
各規則は論理的に OR
で結合されるため、1 つでも規則にマッチした項目は制御フローの難読化の対象になりません。
対象除外リストは、型、メソッド、アセンブリ、モジュール、または名前空間によるモジュールの除外をサポートしています。
各種規則については、制御フローの難読化で詳しく説明します。
文字列の暗号化セクション
文字列の暗号化セクションでは、文字列の暗号化の対象になる型およびメソッドを指定するための詳細な規則など、文字列の暗号化に固有のオプションを指定できます。
文字列の暗号化セクションは省略可能です。 このセクションが存在しない場合、文字列の暗号化機能は無効になります。
文字列の暗号化オプション
disable
オプションを使用すると、文字列の暗号化セクションの残りの部分の内容に関係なく、Dotfuscator は文字列の暗号化をまったく行いません。
文字列の暗号化の無効オプション:
<stringencrypt>
<!--本セクションの残り部分を無視し、文字列暗号化処理をスキップします-->
<option>disable</option>
...
</stringencrypt>
文字列の暗号化対象選択リスト
このセクションは、入力アセンブリに対する文字列の暗号化機能を動的に微調整する方法を提供します。 このセクションには、実行時に適用される対象選択規則のリストを含めます。 規則で特定のクラスまたはメソッドを選択すると、その項目は文字列の暗号化の対象になります。
各規則は論理的に OR で結合されるため、1 つでも規則にマッチした項目は文字列暗号化の対象になります。
対象選択リストは、型、メソッド、アセンブリ、モジュール、または名前空間によるメソッド選択をサポートしています。
各種規則については、ユーザー文字列の暗号化で詳しく説明します。
除去セクション(不要コードの除去)
<removal>
セクションでは、不要コードの除去の対象になる型およびメンバーを指定するための詳細な規則など、除去機能に固有のオプションを指定できます。
<removal>
セクションは省略可能です。 このセクションが存在しない場合、除去機能は無効になり不要コードの除去は行われません。
除去無効オプション
disable
オプションを使用すると、除去セクションの残りの部分の内容に関係なく、Dotfuscator は除去処理をまったく行いません。
<removal>
<!--本セクションの残り部分を無視し、除去(不要コードの除去)処理をスキップします-->
<option>disable</option>
...
</removal>
ConstOnly オプション
このオプションは定数のみ除去を有効にするために使用します。 このモードでは、定数宣言のみが除去されます。 未使用の型、メソッドおよびフィールドは出力アセンブリに反映されます。
定数のみ除去オプション:
<removal>
<!--不要コードの完全な除去ではなく定数のみ除去を使用します-->
<option>constonly</option>
...
</removal>
除去トリガー リスト
不要コードの除去におけるトリガーとは、Dotfuscator がコードで使用されている型やメソッドおよびフィールドを判断するために行う静的依存関係の分析の開始点です。 別の言い方をすると、トリガーとはアプリケーションあるいはライブラリのエントリ ポイントであると言えます。
与えられたトリガーは Dotfuscator によって分析され、そのアプリケーションまたはライブラリが機能するにはどのクラス、メソッドおよびフィールドが必要であるかを判断します。 たとえば、トリガーが呼び出すすべてのメソッド、およびこれらのメソッドが呼び出すメソッドは、Dotfuscator で必要であると判断されます。 つまり、Dotfuscator に対して特定の Main メソッドが必要であると通知した場合、その Main メソッドが呼び出すすべてのメソッドも必要であるということです。
なお、library オプションを使用する場合、トリガー リストは必要ありませんが、あっても受け付けられます。
トリガー リストは、library オプションなどのオプションが暗黙に適用されるトリガーと共に使用されます。
トリガー リストにトリガーを指定する方法は、構成ファイルの他の部分で除外および選択の対象にする要素を選択する方法と同じです。 このリストには、実行時に適用される規則のリストを含めます。 規則で特定のメソッドあるいはフィールドを選択すると、そのメソッドあるいはフィールドはトリガーになります。
各規則は論理的に OR
で結合されるため、1 つでも規則にマッチした項目はトリガーになります。
トリガー リストは、型、メソッド、アセンブリ、モジュール、または名前空間によるフィールド、メソッド、プロパティ、およびイベントの指定をサポートしています。
各種規則については、不要コードの除去で詳しく説明します。
条件付き対象選択リスト
ある型が静的依存関係の分析によって検出できない場合(すなわち型が動的に読み込まれる場合)、その型は条件付きで対象として選択される必要があります。これは、その型自体は依存関係の分析対象になりますが、そのメンバーは依然として除去の対象になることを意味します。 この機能の詳細については、対象選択トリガーと条件付き対象の理解を参照してください。
このセクションは、条件付きで対象として選択される型を動的に指定する方法を提供します。 このセクションには、実行時に適用される対象選択規則のリストを含めます。 規則で特定の型を選択すると、その項目は条件付きで対象として選択されます。
各規則は論理的に OR
で結合されるため、1 つでも規則にマッチした項目は条件付きで対象として選択されます。
対象選択リストは、名前、アセンブリ、モジュール、または名前空間による型の選択をサポートしています。
各種規則については、不要コードの除去で詳しく説明します。
除去の参照規則
参照規則を使用すると、外部ファイルから規則をインポートして、構成間で共有できるようになります。 Dotfuscator の組み込みの除去規則は、これを使用して dotfuscatorReferenceRule
XML ファイルから規則をインポートします。 この規則ファイルは、Dotfuscator をインストールした同じ フォルダーに置かれる Common
ディレクトリにあります。 規則は rulekey
属性で参照されます。値には、参照される規則に定義した GUID を指定します。
参照規則:
<referencerulelist>
<referencerule rulekey="{0D458786-E99F-4593-849B-8512493884A1}"/>
<referencerule rulekey="{C1159284-4F0D-4e9f-B3EC-303828419741}"/>
</referencerulelist>
除去レポート
除去レポートは、統計セクションを含むある特定の実行中に Dotfuscator によって除去されたすべての要素の概要を提供します。 Dotfuscator は除去レポートを解析可能で変換が容易な XML 形式で書き込みます。 名前変更割り当てファイルのように、Dotfuscator は既定の変換ファイルを持っており、このファイルを使用して判読可能な HTML 形式のレポートを生成できます。
Dotfuscator は同じ名前の既存の除去レポートが検出された場合には、自動的にそのレポートの名前を変更してから、新しいレポートで既存レポートを上書きするようになっています。
Dotfuscator に既存の除去レポートの名前を自動的に変更させないように指示するには、構成ファイルに overwrite="true"
という属性を設定します。
XML 形式の除去レポート ファイルについては、不要コードの除去で説明します。
除去レポート:
<removal>
<removalreport overwrite="true">
<file dir="c:\work" name="report.xml"/>
<transform>
<!-- 独自の XSL ファイルの指定は任意です -->
<file dir="c:\mytransforms" name="removal.xsl"/>
</transform>
</removalreport>
</removal>
リンク セクション
リンク セクションでは、アセンブリのリンクに固有のオプションを指定できます。 リンク機能の詳細については、アセンブリのリンクを参照してください。
リンク セクションは省略可能です。 このセクションが存在しない場合、アセンブリのリンク機能は無効になります。
リンク無効オプション
disable
オプションを使用すると、リンク セクションの残りの部分の内容に関係なく、Dotfuscator はリンク処理をまったく行いません。
<linking>
<!-- 本セクションの残り部分を無視し、リンク処理をスキップします -->
<option>disable</option>
...
</linking>
リンク アセンブリ
<linkedassembly>
要素は、1 つ以上の入力アセンブリを特定の出力アセンブリにリンクすることを指定します。 リンク セクションには複数の <linkedassembly>
要素を含むことができるため、このリンク機能を使って複数の出力アセンブリを作成できます。 唯一、1 つの入力アセンブリを複数の出力アセンブリにリンクさせることはできないという制限があります。
<linkedassembly>
要素には子要素を含むことができ、名前変換ポリシーなどのリンク処理オプションや、プライマリ アセンブリ、入力アセンブリのリスト、および出力アセンブリの名前を指定できます。
オプション
現在指定できるオプションは "名前変換ポリシー" のみで、次のいずれかを指定できます。
- donotmangle(改変しない)
- manglesilently(暗黙の改変)
- mangleandwarn(改変して警告)
プライマリ アセンブリ
<primaryinput>
要素はプライマリ アセンブリを定義します。このアセンブリのマニフェスト情報を基に、出力アセンブリのマニフェストが作成されます。 このアセンブリは、次で説明する <assemblylist>
要素にも記述する必要があります。
リンクするアセンブリ
リンクするアセンブリは、<assemblylist>
要素を使って列挙します。 また、各アセンブリは入力アセンブリとしても列挙する必要があります。
出力アセンブリ
<outputassembly>
要素には出力アセンブリの名前と、任意でエントリ ポイント メソッドを指定できます。 アセンブリは出力先ディレクトリに指定された名前で書き込まれます。
例
次の例の <linkedassembly>
要素は、入力アセンブリの Driver.exe
と LibraryC.dll
を out.exe
という名前のアセンブリにリンクすることを指定しています。 エントリ ポイント メソッドは Driver
アセンブリ内の Main
メソッドであると明示的に設定されています。
リンク アセンブリ:
<linkedassembly>
<option>donotmangle</option>
<primaryinput>
<assembly>
<file dir="${configdir}" name="Driver.exe" />
</assembly>
</primaryinput>
<assemblylist>
<assembly>
<file dir="${configdir}" name="Driver.exe" />
</assembly>
<assembly>
<file dir="${configdir}" name="LibraryC.dll" />
</assembly>
</assemblylist>
<outputassembly name="out.exe">
<entrypoint>
<type name="Driver.Form1">
<method name="Main" signature="" />
</type>
</entrypoint>
</outputassembly>
</linkedassembly>
PreMark セクション
PreMark セクションでは、ウォーターマークに固有のオプションを指定できます。 アセンブリのウォーターマークの詳細については、ウォーターマークを参照してください。
PreMark オプション
ウォーターマーカはいくつかの構成オプションをサポートしています。
usepassphrase
オプションは、ウォーターマーク文字列を暗号化してから選択されているアセンブリに適用するよう、ウォーターマーカに指示します。
truncatestring
オプションは、ウォーターマーク文字列が指定されたアセンブリに収まらない場合には文字列を切り捨てるように指示します。 既定の動作では、ウォーターマーク文字列が大きすぎる場合にはビルドが中止されます。 詳細については、ウォーターマーク文字列の長さを参照してください。
disable
オプションを使用すると、PreMark セクションの残りの部分の内容に関係なく、Dotfuscator はウォーターマーク処理をまったく行いません。
PreMark オプション:
<premark>
<!--本セクションの残り部分を無視し、ウォーターマーク処理をスキップします-->
<option>disable</option>
<!-- ウォーターマーク文字列を暗号化します -->
<option>usepassphrase</option>
<!-- 文字列が大きすぎる場合は、文字列を切り詰めて処理を続行します -->
<option>truncatestring</option>
...
</premark>
PreMark の要素
premark セクションには子要素を含むことができ、ウォーターマークを設定する入力アセンブリや、ウォーターマーク文字列を暗号化する際に使用するパスフレーズ、使用する文字エンコード、およびウォーターマーク文字列自体を指定できます。
ウォーターマークを設定するアセンブリ
ウォーターマークを設定するアセンブリは、<assemblylist>
要素を使って列挙します。 また、各アセンブリは入力アセンブリとしても列挙する必要があります。
<passphrase>
<passphrase>
要素では、ウォーターマーク文字列を暗号化する際に使用するパスフレーズを指定します。 usepassphrase
オプションを設定しパスフレーズを指定すれば、ウォーターマーク文字列は暗号化されます。
<encoding>
-
<encoding>
要素では、ウォーターマーク文字列をエンコードする際に使用する文字エンコード(つまり "文字コード")を指定します。<encoding>
要素はname
属性を持ち、サポートされる文字コードを設定できます。 文字コードとその名前については、文字コードで説明します。
<watermark>
<watermark>
要素には、選択したアセンブリに適用する文字列を指定します。 文字列は、まず文字コードによりエンコードされ、次にオプションで暗号化されます。
例
次の例は、MyApp.exe
にウォーターマークを適用するように PreMark を構成しています。 ウォーターマーク文字列の MY WATERMARK
は、まず 6bit-a
文字コードを使ってエンコードされてから、パスフレーズ "mommy
" を使って暗号化されます。
PreMark の要素:
<premark>
<option>usepassphrase</option>
<option>truncatestring</option>
<assemblylist>
<assembly>
<file dir="${configdir}" name="MyApp.exe" />
</assembly>
</assemblylist>
<passphrase>mommy</passphrase>
<encoding name="6bit-a" />
<watermark>MY WATERMARK</watermark>
</premark>
署名セクション
署名セクションでは、厳密名の出力アセンブリに Dotfuscator で署名するかどうか、また署名する場合の方法を指定できます。 アセンブリの署名に関する詳細については、厳密名のアセンブリの難読化を参照してください。 署名セクションは省略可能です。 このセクションが存在しない場合、厳密名の入力アセンブリは Dotfuscator の実行後に再署名されません。
<key> 要素の指定
署名するときに Dotfuscator が使用するキーまたはキー ペアを <key>
要素で指定できます。 <key>
要素には、子要素の <file>
または <container>
のいずれかを含むことができます。 <file>
要素は、キーまたはキー ペアを含んでいるファイルを参照します。 <container>
要素は "name
" 属性を持ち、キー コンテナーの名前を指定できます。
<file> 要素:
<key>
<file dir="c:\temp" name="key.snk" />
</key>
<container> 要素:
<key>
<container name="foo"/>
</key>
<resign> 要素:
Dotfuscator の処理前に既に署名されているアセンブリに再署名する場合は、<resign>
要素を使用します。 使用するキーを指定するカスタム属性がアセンブリに記述されている場合、<key>
要素の指定は必要ありません。 属性を無視したい場合は dontuseattributes
オプションを設定し、<key>
要素を指定します。 アセンブリにキーを指定するカスタム属性がない場合は、<key>
要素を指定する必要があります。
次の例では、Dotfuscator にはキーを指定するカスタム属性をすべて無視するように通知し、代わりに手作業でキー ファイルを指定しています。
<resign> 要素:
<signing>
<resign>
<option>dontuseattributes</option>
<key>
<file dir="c:\temp" name="key.snk" />
</key>
</resign>
...
</signing>
<delaysign> 要素:
入力アセンブリが遅延署名されているとき、その署名プロセスを Dotfuscator で自動的に完了させる場合は、<delaysign>
要素と共に <key>
子要素を指定できます。
<delaysign> 要素:
<signing>
...
<delaysign>
<key>
<file dir="c:\temp" name="key.snk" />
</key>
</delaysign>
</signing>
EventList セクション
eventlist(イベント リスト)セクションでは、ビルド前およびビルド後のイベントを指定できます。 Dotfuscator のビルド イベントの詳細については、ビルド イベントを参照してください。
eventlist セクションは省略可能です。
<event> 要素
イベントは本質的には 1 つのプログラムであり、Dotfuscator のビルド工程におけるある特定の時点に Dotfuscator が実行するものです。 プログラム名、作業ディレクトリ、およびコマンド ライン引数を指定できます。 さらに、イベントは、<option>
要素を使って追加の構成設定をサポートすることもできます。
<event>
要素は type
属性を持ちます。 現在、Dotfuscator が認識できるタイプは prebuild
と postbuild
の 2 つです。 実行するプログラムは <program>
要素を使って指定します。
イベント <program> 要素
イベントの発生時に実行するプログラムは、<program>
要素で指定します。 この要素は、プログラムとプログラムの場所を指定する <file>
要素だけでなく、コマンド ライン引数や作業ディレクトリを指定する <environment>
要素も含んでいます。
commandline
属性には、ファイルやディレクトリと同様に、プロパティ マクロを含むことができます。
プロパティ マクロ:
<program>
<file dir="c:\temp" name="copyfiles.bat" />
<environment commandline="${myproperty}" workingdir="c:\temp" />
</program>
ビルド前のイベント オプション
ビルド前のイベントは 1 つのオプションをサポートしています。オプションは、ビルド前イベントの <event>
要素の中に入れ子で <option>
要素を記述して設定できます。
オプション | |
---|---|
haltonfail | ビルド イベント プログラムがゼロ以外のエラー コードを返した場合、Dotfuscator のビルドを中止します。 |
ビルド後のイベント オプション
ビルド後のイベントはいくつかのオプションをサポートしています。オプションは、ビルド後イベントの <event>
要素の中に入れ子で <option>
要素を記述して設定できます。
オプション | |
---|---|
haltonfail | ビルド イベント プログラムがゼロ以外のエラー コードを返した場合、Dotfuscator のビルドを中止します。 |
runoneachmodule | 出力モジュールごとに 1 回、ビルド後のイベントを実行します。 |
always | Dotfuscator のビルドが成功したか失敗したかにかかわらず、常にビルド後のイベントを実行します。 |
buildfails | Dotfuscator のビルドが失敗した場合にのみ、ビルド後のイベントを実行します。 |
buildsuccessful | Dotfuscator のビルドが成功した場合にのみ、ビルド後のイベントを実行します。 |
例
以下に、XML 構成ファイル内でビルド前およびビルド後のイベントを設定する箇所を示します。 ビルド前のイベントでは、c:\temp\copyfiles.bat プログラムを引数なしで実行します。 ビルドが成功したら、ビルド後のイベントでは、出力アセンブリごとに PEVerify プログラムを実行します。 出力アセンブリ名はプロパティとして PEVerify に渡されていることに注目してください。
XML 構成ファイルの例:
<eventlist>
<event type="prebuild">
<program>
<file dir="c:\temp" name="copyfiles.bat" />
<environment commandline="" workingdir="c:\temp" />
</program>
</event>
<event type="postbuild">
<option>runoneachmodule</option>
<option>haltonfail</option>
<program>
<file dir="C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin" name="PEVerify.exe" />
<environment commandline="${dotf.current.out.module}"
workingdir="${dotf.destination}" />
</program>
</event>
</eventlist>
チェック セクション
チェック セクションでは、入力アセンブリのチェック属性の処理方法を制御するオプションを指定できます。 チェックの詳細については、[チェック]エディターを参照してください。
チェック セクションは省略可能で、定義する場合は sos
要素を用います。
disable
オプションを使用すると、入力アセンブリ内にどのような属性があろうと、構成内にほかの設定があろうと関係なく、Dotfuscator はこのチェック処理をまったく行いません。
チェックの無効オプション:
<sos>
<!-- チェック処理を無効にします -->
<option>disable</option>
</sos>
拡張属性セクション
Dotfuscator では、アプリケーションのソース コードを変更しなくても、メソッドやアセンブリに拡張属性を付けることができます。 拡張属性は、コード内のサポートされている既存のカスタム属性を変更したり、サポートされている属性の新しいインスタンスとして動作することができます。 アプリケーションの処理および変換を行う際、Dotfuscator は拡張属性をカスタム属性と同等のものとして扱います。
サポートされている属性の引数は、<propertylist>
要素を使用して指定できます。
チェック属性のページに一覧表示されているすべての属性が、サポートされる属性です。
拡張属性はメソッド レベルで設定できます。 メソッドを識別するには、定義している型、名前、および署名を指定する必要があります。
例:
<extattributes>
<extattribute name="PreEmptive.Attributes.TamperCheckAttribute">
<type name = "MyApplicaton.MainForm">
<method name="Main" signature="string[]" />
</type>
<propertylist>
<property name="Action" value="Hang" />
<property name="ActionProbability" value=".5" />
<property name="ActivationStatusSinkElement" value="field" />
<property name="ActivationStatusSinkName" value="tampered" />
</propertylist>
</extattribute>
</extattributes>
SmartObfuscation セクション
スマート難読化により、Dotfuscator はアプリケーションの種類に特有の規則に基づいて、名前の変更や除去を実行できない要素を自動検出できるようになります。 スマート難読化は既定で有効に設定されており、ほとんどの場合は有効にしておく必要があります。 ユーザーが積極的な難読化を行ってもアプリケーションを損なわないと確信している場合には、このセクションの disable
オプションの設定で無効することができます。
スマート難読化にはレポート機能が用意されており、このセクションでレポートの詳細を構成できます。 詳細属性に使用できる値は、すべて
、警告のみ
、および なし
です。 既定値は all
です。
スマート難読化レポートは、任意でディスクに書き出すことができます。 Dotfuscator は同じ名前の既存のスマート難読化レポートが検出された場合には、自動的にそのレポートの名前を変更してから、新しいレポートで既存レポートを上書きします。 Dotfuscator に既存のスマート難読化レポートの名前を自動的に変更させないように指示するには、構成ファイルに overwrite="true"
という属性が必要になります。
XML 形式のスマート難読化レポートについては、「スマート難読化」セクションで説明しています。
SmartObfuscation:
<smartobfuscation>
<!-- 本セクションの残り部分を無視し、スマート難読化処理をスキップします -->
<option>disable</option>
<smartobfuscationreport verbosity="all" overwrite="true">
<!-- 出力レポート ファイルの指定は任意です -->
<file dir="c:\myapp" name="smartobfuscation.xml"/>
</smartobfuscationreport>
</smartobfuscation>
対象プラットフォーム固有の構成
Dotfuscator では、対象とするプラットフォーム固有の構成ファイルの作成と使用をサポートしているので、MAUI プロジェクトに役立ちます。 この機能を有効にすると、Dotfuscator は指定された対象プラットフォームごとに個別の構成ファイルを作成します。 MAUI アプリが Android、iOS、Mac、および Windows プラットフォームを対象としている場合、Dotfuscator はDotfuscatorConfig_Android.xml、 DotfuscatorConfig_iOS.xml、DotfuscatorConfig_MacCatalist.xml およびDotfuscatorConfig_Windows.xml を作成します。
プラットフォーム固有の構成ファイルのサポートを有効にするには、.csproj ファイルに次のタグを追加します。
<DotfuscatorUsePlatformSpecificConfig>true</DotfuscatorUsePlatformSpecificConfig>
プロジェクト ファイルからこのタグを削除すると、Dotfuscator は 1 つの構成ファイルの動作にフォール バック(Dotfuscator の既定動作)することに注意してください。
XML 構成ファイルに関する注意
Dotfuscator は、構成ファイルおよび割り当てファイルに XML 形式のドキュメントを使用します。 これらのドキュメントは読み込まれると、doctype
で指定される文書型定義(DTD)によって検証されます。 Dotfuscator は検証を実行するために、関連する DTD にアクセスできる必要があります。
Dotfuscator は、DTD を検索するために以下の手順を実行します。
- DTD URI がローカル ファイルを指定する場合は、Dotfuscator は指示された場所でそのファイルを検索します。 見つからない場合は、エラーが発生します。
-
DTD の URI が Web リソースを指定する場合は、Dotfuscator は最初に URI で指定された名前を持つファイルが Dotfuscator のキャッシュ内にあるかどうかを調べます。 Dotfuscator のキャッシュはインストール ディレクトリの
Common
ディレクトリ(C:\Program Files (x86)\PreEmptive Protection Dotfuscator Professional A.B.C\Common
)にあります。 - 見つからない場合、Dotfuscator は DTD を取得するために URI にアクセスします。 見つかった場合、Dotfuscator は次回の要求がネットワークにアクセスする必要がないように、インストール ディレクトリに DTD をキャッシュします。 DTD が見つからない場合、または Dotfuscator がネットワークから DTD を取得できない場合は、エラーが発生します。
カスタム規則
Dotfuscator では、アプリケーションに対する難読化規則をカスタマイズすることができます。 対象選択規則および対象除外規則は、名前の変更、制御フローの難読化、文字列の暗号化および入力アセンブリの除去について動的に微調整する方法を提供します。 これらの規則は、library オプションなどのオプションによって暗黙に適用される規則と併せて適用され、論理的に OR
で結合されます。
対象除外規則
対象除外リスト セクションは、入力アセンブリの名前の変更および制御フローの難読化を動的に微調整する方法を提供します。 ユーザーは、実行時に適用される規則のリストを指定します。 規則で特定のクラス、メソッド、またはフィールドを選択した場合、その項目の名前は変更されません。また、その項目は制御フローの難読化の対象から除外されます。
これらの規則は、library オプションなどのオプションによって暗黙に適用される規則と併せて適用されます。
規則は論理的に OR
で結合されます。
名前空間、型、メソッド、またはフィールドの選択には、正規表現(RE)を使用できます。 これを実行するには、省略可能な regex
属性を使用します。 regex
の既定値は false です。 regex
が true の場合、name
属性の値は正規表現として解釈されます。regex
が false の場合、name は文字どおりに解釈されます。 正規表現は特定の文字(ピリオドなど)に特別な意味を割り当てているので、regex の値は重要です。
以下に、簡単な正規表現の例を示します。
.* すべてと一致
MyLibrar. MyLibrary、MyLibrari などと一致
My[\.]Test[\.]I.* My.Test.Int1、My.Test.Internal などと一致
Get.* GetInt、GetValue などと一致
Get* Ge、Get、Gett、Gettt などと一致
正規表現の構文の詳細については、.NET Framework のドキュメントを参照してください。
名前空間の対象除外
このオプションは、指定した名前空間内のすべての型とそのメンバーを対象から除外します。 名前空間の指定には正規表現を使用できます。
正規表現:
<namespace name="My.Excluded.Namespace"/>
型の対象除外
このオプションは、名前または属性指定子によって型を対象から除外します。 型名の指定には正規表現を使用できます。 型名は完全修飾名である必要があります。 内側の(入れ子になっている)クラスは、外側と内側のクラスの間に '/' を区切り文字として使用して指定します。 たとえば、次のように記述します。
内側の(入れ子になっている)クラス:
<type name="Library.Class1/NestedClass"/>
属性指定子の選択や選択解除には、speclist
属性を使用します。 speclist
属性は、型の有効な属性指定子をカンマで区切って指定します。 利用可能な値は以下のとおりです。
利用可能な値:
abstract
interface
nestedassembly
nestedfamily
nestedfamorassem
nestedprivate
nestedpublic
notpublic
public
sealed
serializable
enum
属性指定子の前に '-' を付けると、規則の意味が反転します(つまり、指定した属性を持たないすべてのクラスを対象から除外します)。 '+' を指定することもできますが、必要ありません。 このリストに暗黙に適用される規則は、論理的に AND-
で結合されます(つまり、対象から除外する型のセットは、各規則に一致するすべての型の共通部分となります)。 たとえば、次の規則は、public 型かつ sealed 型のものを対象から除外します。
Public 型かつ Sealed 型を対象から除外する規則:
<type name=".*" speclist="+public,+sealed" regex="true"/>
<type>
要素を使用して型を選択し、選択した型内からフィールド、メソッド、プロパティ、およびイベントを除外する規則を指定することもできます。 これにより、メンバーを除外しても、メンバーが所有している型は除外しないでおくことができます。 これを実行するには、省略可能な excludetype
属性を使用します。 指定がない場合、既定値は true
であり、その型名が名前の変更または制御フローの難読化の対象から除外されます。
フィールド、メソッド、プロパティ、およびイベントの対象除外規則の指定:
<type name="MyCo.Test.MyOtherTest" excludetype="false">
<!-- ここで指定したメソッドとフィールドは除外されます -->
...
</type>
型の規則がプロパティやイベントの規則を含んでいない場合、対象から除外される型のすべてのプロパティ名およびイベント名は保持されます。 型の規則がプロパティの規則を 1 つ以上含んでいる場合は、それらのプロパティ名のみが保持され、それ以外のプロパティ名はすべて削除されます。 型の規則がイベントの規則を 1 つ以上含んでいる場合は、それらのイベント名のみが保持され、それ以外のイベント名はすべて削除されます。
注意:型が対象から除外されておらず、ライブラリ オプションが設定されていない場合、Dotfuscator はプロパティ名とイベント名を削除します。
名前の変更にのみ適用:
applytoderivedtypes
属性を指定することによって、継承階層全体に型の規則を適用することができます。 この属性の値を true
に設定すると、型の規則および、それに含まれるすべてのメソッド、フィールド、プロパティ、イベント、カスタム属性、またはスーパータイプの規則が、選択されている型とそれから派生するすべての型に適用されます。 指定がない場合、既定値は false
であり、指定した型にのみ型の規則が適用されます。
メソッドの対象除外
メソッドの除外は、まず <type>
要素を使用して型を選択し、次に対象から除外するメソッドを選択する規則を指定することによって行われます。 メソッドは、名前や属性指定子によって対象から除外できるほか、署名によっても除外できます。
利用可能な属性指定子:
abstract
assembly
family
familyorassembly
final
private
public
static
virtual
属性指定子が明示的に設定されていない場合、speclist
属性は選択条件として使用されません。
次の例では、"Set" で始まるすべてのパブリック インスタンス メソッドが選択されます。
<method regex="true" name="Set.*" speclist="+public,-static"/>
メソッドの署名は、signature
属性を使用して指定します。 署名は、メソッドの戻り値の型とパラメーターの型を特定します。
戻り値の型とパラメーターの型:
signature="" <!-- 空の署名 -->
signature="string(int,MyClass,MyClass[])"
署名が明示的に設定されていない場合、メソッドの署名は選択条件として使用されません。
次の例では、署名によってメソッドが選択されます。
署名によるメソッド:
<method name="DoIt" signature="string(int, System.Console, System.Collection.ICollection, float[])"/>
"Module:mod_name
" という名前の特別な型セレクターを使用すると、グローバル メソッドを指定できます。mod_name
には、グローバル メソッドを含んでいるモジュールの名前を指定します。
フィールドの対象除外
フィールドの除外は名前の変更でのみ有効です。 フィールドの除外は、まず <type>
要素を使用して型を選択し、次に対象から除外するフィールドを選択する規則を指定することによって行われます。 フィールドもまた、名前および属性指定子によって対象から除外できます。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
notserialized
属性指定子が明示的に設定されていない場合、フィールドの属性は選択条件として使用されません。 次の例では、"ENUM_
" で始まる静的フィールドがすべて選択されます。
"ENUM_" で始まる静的フィールド:
<field regex="true" name="ENUM_.*" speclist="+static"/>
フィールドの署名は、signature
属性を使用して指定します。
署名はフィールドの型を指定します。
signature="" <!-- 空の署名 -->
signature="int"
署名が明示的に設定されていない場合、フィールドの型は選択条件として使用されません。
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル フィールドを指定できます。mod_name
には、グローバル フィールドを含んでいるモジュールの名前を指定します。
プロパティの対象除外
プロパティの除外は名前の変更でのみ有効です。 プロパティの規則は、型の規則によって限定されるので、規則の編集ビューでは型ノードの子として表示されます。 プロパティの規則は、(親の型の規則の条件を満たすすべての型のプロパティのうちで)条件を満たすすべてのプロパティを選択します。 サポートされる選択条件は、プロパティ名およびプロパティの属性です。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
属性指定子が明示的に設定されていない場合、プロパティの属性は選択条件として使用されません。
次の例では、"Sample" で始まるすべてのプロパティが選択されます。
<propertymember regex="true" name="Sample.*"/>
プロパティの署名は、signature
属性を使用して指定します。
署名はプロパティの型を指定します。
signature="" <!-- 空の署名 -->
signature="int"
署名が明示的に設定されていない場合、プロパティの型は選択条件として使用されません。
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル プロパティを指定できます。mod_name
には、グローバル プロパティを含んでいるモジュールの名前を指定します。
イベントの対象除外
イベントの除外は名前の変更でのみ有効です。 イベントの規則は、型の規則によって限定されるので、規則の編集ビューでは型ノードの子として表示されます。 イベントの規則は、(親の型の規則の条件を満たすすべての型のフィールドのうちで)条件を満たすすべてのイベントを選択します。 サポートされる選択条件は、イベント名およびイベントの属性です。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
属性指定子が明示的に設定されていない場合、イベントの属性は選択条件として使用されません。
"On" で始まるすべてのイベントが選択されます。
<eventmember regex="true" name="On.*"/>
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル イベントを指定できます。mod_name
には、グローバル イベントを含んでいるモジュールの名前を指定します。
カスタム属性による対象除外
型、メソッド、フィールドは、カスタム属性を基に選択的に除外できます。 カスタム属性の規則では、項目(型、メソッド、フィールド、プロパティ)の追加情報であるカスタム属性の名前を基に項目を選択します。 型、メソッド、フィールド、プロパティを選択する規則の中に、カスタム属性の規則を 1 つ以上入れ子にすることができます。
型、メソッド、フィールド、プロパティの規則には、カスタム属性の規則を複数関連付けることができます。 この場合、カスタム属性の規則のいずれか 1 つにでも項目がマッチすれば、その項目は選択されます。
次の例では、カスタム属性の MyCustomAttribute
または MyOtherCustomAttribute
を持つすべての型が選択されます。
MyCustomAttribute または MyOtherCustomAttribute を持つ型:
<type name=".*" excludetype="false" regex="true">
<customattribute name="MyCustomAttribute"/>
...
<customattribute name="MyOtherCustomAttribute"/>
</type>
カスタム属性の規則では、カスタム属性の名前の条件を正規表現によって記述することもできます。 次の例も、カスタム属性の MyCustomAttribute
または MyOtherCustomAttribute
を持つすべての型が選択されます。
MyCustomAttribute または MyOtherCustomAttribute を持つ型:
<type name=".*" excludetype="false" regex="true">
<customattribute name="My.*CustomAttribute" regex="true"/>
</type>
次の例は、MyCustomAttribute
という名前のカスタム属性を持つすべてのメソッドを除外する方法を示しています。
カスタム属性を持つメソッドの対象除外:
<type name=".*" excludetype="false" regex="true">
<method name=".*" regex="true">
<customattribute name="MyCustomAttribute"/>
</method>
</type>
カスタム属性の規則は、allowinheritance
属性を指定することによって、サブタイプやオーバーライドするメソッドおよびプロパティに適用することができます。 この属性の値が true
に設定されていると、指定したカスタム属性を持つサブタイプやオーバーライドするメソッドおよびプロパティも対象から除外されるようになります。
スーパータイプによる対象除外
型は、スーパータイプによって選択的に対象から除外できます。 スーパータイプの規則では、指定した型が継承する型の名前を基に型を選択します。 型を選択する規則の中に、スーパータイプの規則を 1 つ以上入れ子にすることができます。
型の規則には、スーパータイプの規則を複数関連付けることができます。 この場合、スーパータイプの規則のいずれか 1 つにでも項目がマッチすれば、その項目は選択されます。
次の例では、MySupertype
から継承するすべての型が選択されます。
MySupertype から継承するすべての型:
<type name=".*" excludetype="false" regex="true">
<supertype name="MySupertype"/>
</type>
スーパータイプの規則では、スーパータイプの名前の条件を正規表現によって記述することもできます。 次の例では MySupertype
または MyOtherSupertype
のいずれかから継承するすべての型を選択する方法を示しています。
MySupertype または MyOtherSupertype から継承するすべての型:
<type name=".*" excludetype="false" regex="true">
<supertype name="My.*Supertype" regex="true"/>
</type>
アセンブリの対象除外
アセンブリは、名前によって対象から除外できます。 アセンブリが対象から除外されると、そのアセンブリのモジュール内のすべての型およびメンバーが除外されます。 以下のような状況では、アセンブリを対象から除外するのが妥当です。
- アセンブリ A は難読化する必要がある
- アセンブリ B は難読化してはならない
- アセンブリ B はアセンブリ A に依存している
つまり、A は B だけにサービスを提供しています。 B の内部に埋め込まれた A への参照を難読化する場合、B は A と同時に処理されるよう指定しますが、名前の変更や制御フローの難読化の対象からは除外します。
アセンブリの対象除外:
<assembly>
<file dir="c:\src\app1\" name="ExcludedLib.dll"/>
</assembly>
モジュールの対象除外
モジュールは、名前によって対象から除外できます。 アセンブリ属性を使用すると、モジュールを特定のアセンブリに限定できます。 アセンブリ属性を指定する場合、アセンブリ名は物理ファイル名ではなく論理アセンブリ名で指定する必要があります。 モジュールが対象から除外されると、そのモジュールで定義されているすべての型およびメンバーが対象から除外されます。
当然、指定したモジュールが複数のアセンブリ間で共有されている場合、そのモジュールはすべてのアセンブリから除外されます。
モジュールをすべてのアセンブリから除外する:
<module name="MyLibResource.dll" assemblyname="MyLib"/>
対象選択規則
対象選択リスト セクションは、入力アセンブリに対する文字列の暗号化および不要コードの除去機能を動的に微調整する方法を提供します。 ユーザーは、実行時に適用される規則のリストを指定します。 規則で特定のクラス、メソッド、フィールド、プロパティ、またはイベントを選択すると、その項目は文字列の暗号化および不要コードの除去の対象として選択されます。
これらの規則は、library オプションなどのオプションによって暗黙に適用される規則と併せて適用されます。
規則は論理的に OR
で結合されます。
名前空間、型、メソッド、フィールド、プロパティ、またはイベントの選択には、正規表現(RE)を使用できます。 これを実行するには、省略可能な regex
属性を使用します。 regex
の既定値は false です。 regex
が true の場合、name
属性の値は正規表現として解釈されます。regex
が false の場合、name は文字どおりに解釈されます。 正規表現は特定の文字(ピリオドなど)に特別な意味を割り当てているので、regex の値は重要です。
以下に、簡単な正規表現の例を示します。
正規表現:
.* すべてと一致
MyLibrar. MyLibrary、MyLibrari などと一致
My[\.]Test[\.]I.* My.Test.Int1、My.Test.Internal などと一致
Get.* GetInt、GetValue などと一致
Get* Ge、Get、Gett、Gettt などと一致
名前空間の対象選択
このオプションは、指定した名前空間内のすべての型とそのメソッドを対象として選択します。 名前空間の指定には正規表現を使用できます。
正規表現:
<namespace name="My.Included.Namespace"/>
型の対象選択
このオプションは、名前または属性指定子によって型を対象として選択します。 型名の指定には正規表現を使用できます。
型名は完全修飾名である必要があります。
内側の(入れ子になっている)クラスは、外側と内側のクラスの間に '/' を区切り文字として使用して指定します。 たとえば、次のように記述します。
内側の(入れ子になっている)クラス:
<type name="Library.Class1/NestedClass"/>
属性指定子の選択や選択解除には、speclist
属性を使用します。 speclist
属性は、型の有効な属性指定子をカンマで区切って指定します。 利用可能な値は以下のとおりです。
属性指定子:
abstract
interface
nestedassembly
nestedfamily
nestedfamorassem
nestedprivate
nestedpublic
notpublic
public
sealed
serializable
enum
属性指定子の前に '-' を付けると、規則の意味が反転します(つまり、指定した属性を持たないすべてのクラスを対象として選択します)。 '+' を指定することもできますが、必要ありません。 このリストに暗黙に適用される規則は、論理的に AND
で結合されます(つまり、対象として選択する型のセットは、各規則に一致するすべての型の共通部分となります)。 たとえば、次の規則は public かつ sealed である型のメソッドをすべて対象として選択します。
Public 型かつ Sealed 型であるメソッドの対象選択:
<type name=".*" speclist="+public,+sealed" regex="true"/>
<type>
要素を使用して型を選択し、選択した型内から個別のメソッドを対象として選択する規則を指定することもできます。 これにより、ある型の一部のメソッドでのみ文字列を暗号化でき、それ以外のメソッドでは暗号化できないようになります。 なお、<type>
要素の excludetype
属性は文字列の暗号化の対象選択には使用されないことに注意してください。
ある型の一部のメソッドにおける暗号化:
<type name="MyCo.Test.MyOtherTest">
<!-- ここで指定した個々のメソッドが対象として選択されます -->
...
</type>
<type>
要素が入れ子になった <method>
要素を含んでいない場合は、すべてのメソッドが対象として選択されます。 これは、対象除外規則とは対照的です。
除外にのみ適用:
applytoderivedtypes
属性を指定することによって、継承階層全体に型の規則を適用することができます。 この属性の値を true
に設定すると、型の規則および、それに含まれるすべてのメソッド、フィールド、プロパティ、イベント、カスタム属性、またはスーパータイプの規則が、選択されている型とそれから派生するすべての型に適用されます。 指定がない場合、既定値は false
であり、指定した型にのみ型の規則が適用されます。
メソッドの対象選択
メソッドの選択は、まず <type>
要素を使用して型を選択し、次に対象とするメソッドを選択する規則を指定することによって行われます。 メソッドは、(前述の型のセクションで説明したように)名前や属性指定子によって対象として選択できるほか、署名によっても選択できます。
利用可能な属性指定子:
abstract
assembly
family
familyorassembly
final
private
public
static
virtual
属性指定子が明示的に設定されていない場合、speclist
属性は選択条件として使用されません。
次の例では、Set
で始まるすべてのパブリック インスタンス メソッドが選択されます。
Set で始まるすべてのパブリック インスタンス メソッド:
<method regex="Qtrue" name="Set.*" speclist="+public,-static"/>
メソッドの署名は、signature
属性を使用して指定します。 署名は、メソッドの戻り値の型とパラメーターの型を特定します。
メソッドの戻り値の型とパラメーターの型:
signature="" <!-- 空のパラメーター リスト -->
signature="string(int,MyClass,MyClass[])"
署名が明示的に設定されていない場合、メソッドの署名は選択条件として使用されません。
次の例では、署名によってメソッドが選択されます。
署名によるメソッドの選択:
<method name="DoIt" signature="string(int, System.Console, System.Collection.ICollection, float[])"/>
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル メソッドを指定できます。mod_name
には、グローバル メソッドを含んでいるモジュールの名前を指定します。
フィールドの対象選択
フィールドの対象選択は、除去トリガーおよび除去の条件付き選択対象でのみ有効です。
フィールドの選択は、まず <type>
要素を使用して型を選択し、次にフィールドを選択する規則を指定することによって行われます。 フィールドは、(前述の型のセクションで説明したように)名前および属性指定子によって選択できます。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
notserialized
属性指定子が明示的に設定されていない場合、フィールドの属性は選択条件として一切使用されません。
次の例では、"ENUM_
" で始まる静的フィールドがすべて選択されます。
"ENUM_" で始まる静的フィールド:
<field regex="true" name="ENUM_.*" speclist="+static"/>
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル フィールドを指定できます。mod_name
には、グローバル フィールドを含んでいるモジュールの名前を指定します。
プロパティの対象選択
プロパティの対象選択は、不要コードの除去でのみ有効です。 プロパティの規則は、型の規則によって限定されるので、規則の編集ビューでは型ノードの子として表示されます。 プロパティの規則は、(親の型の規則の条件を満たすすべての型のプロパティのうちで)条件を満たすすべてのプロパティを選択します。 サポートされる選択条件は、プロパティ名およびプロパティの属性です。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
属性指定子が明示的に設定されていない場合、プロパティの属性は選択条件として使用されません。
次の例では、"Sample
" で始まるすべてのプロパティが選択されます。
"Sample" で始まるプロパティ:
<property regex="true" name="Sample.*"/>
プロパティの署名は、signature
属性を使用して指定します。 署名はプロパティの型を指定します。
プロパティの型を指定する署名:
signature="" <!-- 空の署名 -->
signature="int"
署名が明示的に設定されていない場合、プロパティの型は選択条件として使用されません。
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル プロパティを指定できます。mod_name
には、グローバル プロパティを含んでいるモジュールの名前を指定します。
イベントの対象選択
イベントの対象選択は、不要コードの除去でのみ有効です。 イベントの規則は、型の規則によって限定されるので、規則の編集ビューでは型ノードの子として表示されます。 イベントの規則は、(親の型の規則の条件を満たすすべての型のフィールドのうちで)条件を満たすすべてのイベントを選択します。 サポートされる選択条件は、イベント名およびイベントの属性です。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
属性指定子が明示的に設定されていない場合、イベントの属性は選択条件として使用されません。
次の例では、"On
" で始まるすべてのイベントが選択されます。
"On" で始まるイベント:
<event regex="true" name="On.*"/>
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル イベントを指定できます。mod_name
には、グローバル イベントを含んでいるモジュールの名前を指定します。
カスタム属性による対象選択
型およびメソッドは、カスタム属性を基に選択的に対象として選択できます。 カスタム属性の規則では、項目(型またはメソッド)の追加情報であるカスタム属性の名前を基に項目を選択します。 型またはメソッドを選択する規則の中に、カスタム属性の規則を 1 つ以上入れ子にすることができます。
型またはメソッドの規則には、カスタム属性の規則を複数関連付けることができます。 この場合、カスタム属性の規則のいずれか 1 つにでも項目がマッチすれば、その項目は選択されます。
次の例では、カスタム属性の MyCustomAttribute
または MyOtherCustomAttribute
を持つすべての型が選択されます。
MyCustomAttribute または MyOtherCustomAttribute を持つ型:
<type name=".*" excludetype="false" regex="true">
<customattribute name="MyCustomAttribute"/>
...
<customattribute name="MyOtherCustomAttribute"/>
</type>
カスタム属性の規則では、カスタム属性の名前の条件を正規表現によって記述することもできます。 次の例も、カスタム属性の MyCustomAttribute
または MyOtherCustomAttribute
を持つすべての型が選択されます。
MyCustomAttribute または MyOtherCustomAttribute を持つ型の選択:
<type name=".*" excludetype="false" regex="true">
<customattribute name="My.*CustomAttribute" regex="true"/>
</type>
次の例は、MyCustomAttribute
という名前のカスタム属性を持つすべてのメソッドを対象として選択する方法を示しています。
MyCustomAttribute を持つメソッドの対象選択:
<type name=".*" excludetype="false" regex="true">
<method name=".*" regex="true">
<customattribute name="MyCustomAttribute"/>
</method>
</type>
カスタム属性の規則は、allowinheritance
属性を指定することによって、サブタイプやオーバーライドするメソッドおよびプロパティに適用することができます。 この属性の値が true
に設定されていると、指定したカスタム属性を持つサブタイプやオーバーライドするメソッドおよびプロパティも対象から除外されるようになります。
スーパータイプによる対象選択
型は、スーパータイプを基に選択的に対象として選択できます。 スーパータイプの規則では、指定した型が継承する型の名前を基に型を選択します。 型を選択する規則の中に、スーパータイプの規則を 1 つ以上入れ子にすることができます。
型の規則には、スーパータイプの規則を複数関連付けることができます。 この場合、スーパータイプの規則のいずれか 1 つにでも項目がマッチすれば、その項目は選択されます。
次の例では、MySupertype
から継承するすべての型が選択されます。
MySuperType から継承する型の選択:
<type name=".*" excludetype="false" regex="true">
<supertype name="MySupertype"/>
</type>
スーパータイプの規則では、スーパータイプの名前の条件を正規表現によって記述することもできます。 次の例では MySupertype
または MyOtherSupertype
のいずれかから継承するすべての型を選択する方法を示しています。
MySupertype または MyOtherSupertype から継承する型の選択:
<type name=".*" excludetype="false" regex="true">
<supertype name="My.*Supertype" regex="true"/>
</type>
アセンブリの対象選択
アセンブリは、名前によって対象として選択できます。 アセンブリが対象として選択されると、そのアセンブリのモジュール内のすべての型およびメソッドが対象として選択されます。
アセンブリの対象選択:
<assembly>
<file dir="c:\src\app1\" name="IncludedLib.dll"/>
</assembly>
モジュールの対象選択
モジュールは、名前によって対象として選択できます。 アセンブリ属性を使用すると、モジュールを特定のアセンブリに限定できます。 アセンブリ属性を指定する場合、アセンブリ名は物理ファイル名ではなく論理アセンブリ名で指定する必要があります。 モジュールが対象として選択されると、そのモジュールで定義されているすべての型およびメンバーが対象として選択されます。
当然、指定したモジュールが複数のアセンブリ間で共有されている場合、そのモジュールはすべてのアセンブリに対して処理対象として選択されます。
モジュールの対象選択:
<module name="MyLibResource.dll" assemblyname="MyLib"/>