アセンブリのマージ
アセンブリは、babel コマンドラインツール、MSBuild の Babel タスク、または Babel Desktop でマージできます。
Avalonia アプリケーションはマージできません。Avalonia は、各アセンブリの XAML をアセンブリごとの CompiledAvaloniaXaml 型と単一の !AvaloniaResources ブロブにコンパイルし、アセンブリ ID をキーとする avares://<AssemblyName>/… URI でアセットを解決します。XAML を含むアセンブリをマージすると、これらの型とリソースが衝突し、実行時に avares:// の解決ができなくなります。Avalonia アプリケーションを単一ファイルとして配布するには、代わりにアセンブリの埋め込みを使用してください。こちらは各アセンブリの ID を維持します。
コマンドラインからのマージ
babel ツールでは、ターゲットアセンブリに続けて、プライマリアセンブリにマージするアセンブリファイルの一覧と、その他の設定オプションを指定することで、アセンブリをマージできます。
babel <primary assembly source> [<other assemblies>...] [options]Babel Obfuscator には、アセンブリのマージを設定するためのオプションがいくつかあります。
—[no]copyattrs [regex]
このオプションは、Babel がアセンブリレベルの属性をプライマリアセンブリにコピーするかどうかを指定します。マージする属性の完全名に一致させる正規表現を、任意で指定することもできます。--copyattrs を複数回指定すると、複数の属性フィルターを指定できます。アセンブリレベルの属性のコピーを無効にするには、--nocopyattrs を指定します。
アセンブリレベルの属性をコピーする場合は、XML ルールで CopyAttributes プロパティと NoCopyAttributes プロパティを使用して、コピーする属性または除外する属性を絞り込めます。これらのプロパティには、アセンブリレベルの属性の完全な型名に一致させる正規表現を指定します。
<Rule name="merge attributes" feature="merge" exclude="false">
<Target>Assembly</Target>
<Pattern>*</Pattern>
<Properties>
<NoCopyAttributes>.*TypeLibVersion</NoCopyAttributes>
</Properties>
</Rule>CopyAttributes のフィルター式は、属性の型の完全修飾名に基づいて、マージされたアセンブリに含めるアセンブリレベルの属性を選択するために使用します。つまり、フィルター式に一致する属性だけがターゲットアセンブリにマージされ、それ以外はすべて除外されます。
一方、NoCopyAttributes のフィルター式は、属性の型の完全修飾名に基づいて、マージされたアセンブリから除外するアセンブリレベルの属性を選択するために使用します。つまり、フィルター式に一致する属性はどれもターゲットアセンブリにマージされず、それ以外はすべて含まれます。
—[no]internalize:
有効にすると、マージされたアセンブリのすべての型の可視性が public から internal に変更されます。
型の可視性を変更すると、マージされた型をプライマリアセンブリの外部から使用できなくなる場合があります。そのため、このオプションは、マージされた型をプライマリアセンブリだけが使用する場合にのみ有効にしてください。
MSBuild の Babel タスクからのマージ
Babel タスクでアセンブリをマージするには、MSBuild プロジェクトファイルに ItemGroup 要素を追加で定義する必要があります。この ItemGroup には、プライマリアセンブリにマージするすべてのアセンブリを含めます。Babel タスクは、ビルド中にこの ItemGroup を使用してマージを実行します。
ItemGroup 要素の定義例を次に示します。
<ItemGroup>
<MergeAssembly Include="path/to/assembly1.dll"/>
<MergeAssembly Include="path/to/assembly2.dll"/>
</ItemGroup>この例の path/to/assembly1.dll と path/to/assembly2.dll は、プライマリアセンブリにマージするアセンブリのパスです。ItemGroup には、必要な数だけアセンブリを含められます。
ItemGroup を定義したら、MergeAssemblies パラメーターを使って Babel タスクに渡します。
<Babel MergeAssemblies="@(MergeAssembly)" Internalize="true" />Internalize 属性は、マージされた型の可視性を public から internal に変更するかどうかを指定します。
Babel Desktop からのマージ
Babel Desktop でアセンブリをマージするには、次の手順に従います。
プロジェクトを開くか作成する
既存のプロジェクトを開くか、新しいプロジェクトを作成します。
アセンブリを追加する
プライマリアセンブリとマージするアセンブリを、プロジェクトのキャンバスに追加します。
依存関係を接続する
各依存関係をプライマリアセンブリに接続します。依存関係の下のアンカーから、プライマリアセンブリの上のアンカーへドラッグします。
接続の種類を「マージ」に設定する
接続の種類が「マージ」になっていることを確認します。プライマリアセンブリが依存関係を参照している場合、新しい接続では「マージ」が自動的に選択されます。そうでない場合は、接続をクリックして種類を変更します。
マージのオプションを設定する
プライマリアセンブリを選択し、プロパティパネルでマージのオプションを設定します。たとえば、「最適化」グループの Internalize や CopyAttributes です。
プロジェクトのキャンバスについて詳しくは、難読化プロジェクトを参照してください。