カスタム リンカーの構成

既定のオプションのセットでは不十分な場合、リンカーからの必要なものについて記述した XML ファイルを使用してリンク プロセスを促進することができます。

型、メソッド、フィールドがアプリケーションから削除されないように、追加の定義をリンカーに指定できます。 独自のコードの場合、推奨される方法は [Preserve] カスタム属性を使用することです。詳細は、「iOS でのリンク」ガイドと「Android でのリンク」ガイドにあります。 ただし、SDK またはプロダクト アセンブリからの定義をいくつか必要とする場合、(必要な要素がリンカーによって削除されないコードの追加よりも) XML ファイルの利用が最適な解決策となることがあります。

これを行うには、最上位要素 <linker> で XML ファイルを定義します。この要素にはアセンブリ ノードが含まれ、アセンブリ ノードにはノードが含まれ、型ノードにはメソッド ノードとフィールド ノードが含まれます。

このリンカー記述ファイルが与えられたら、それをプロジェクトに追加し、次の操作を行います。

  • Android の場合: ビルド アクションLinkDescription に設定します
  • iOS の場合: ビルド アクションLinkDescription に設定します

次の例では、XML ファイルがどのようなものであるかを確認できます。

<linker>
        <assembly fullname="mscorlib">
                <type fullname="System.Environment">
                        <field name="mono_corlib_version" />
                        <method name="get_StackTrace" />
                </type>
        </assembly>
        <assembly fullname="My.Own.Assembly">
                <type fullname="Foo" preserve="fields">
                        <method name=".ctor" />
                </type>
                <type fullname="Bar">
                        <method signature="System.Void .ctor(System.String)" />
                        <field signature="System.String _blah" />
                </type>
                <namespace fullname="My.Own.Namespace" />
                <type fullname="My.Other*" />
        </assembly>
</linker>

上の例では、リンカーが指示を読み取り、mscorlib.dll (Mono for Android で出荷) アセンブリと My.Own.Assembly (ユーザー コード) アセンブリに適用します。

最初のセクションは mscorlib.dll の定義ですが、これによって System.Environment 型はフィールド mono_corlib_version とメソッド get_StackTrace を保持します。 リンカーは IL で動作し、C# プロパティを認識しないため、getter または setter メソッドの名前を利用する必要があります。

2 番目のセクションは My.Own.Assembly.dll の定義ですが、これによって型 Foo はすべてのフィールド (すなわち、preserve="fields" 属性) とすべてのコンストラクター (すなわち、IL のすべての .ctor メソッド) を保持します。 型 Bar は 1 つのコンストラクター (文字列パラメーターを 1 つ受け取る) のためと特定の文字列フィールド _blah のために特定の署名 (名前ではなく) を保持します。 名前空間 My.Own.Namespace はそれに含まれているすべての型を保持します。 最後に、完全な名前 (名前空間を含む) がワイルドカード パターン "My.Other*" と一致する型は、そのすべてのフィールドとメソッドを保持します。 ワイルドカード文字 * は "type fullname" パターン内に複数回含めることができます。