カスタム リンカーの構成Custom Linker Configuration

既定のオプションのセットでは不十分な場合、リンカーからの必要なものについて記述した XML ファイルを使用してリンク プロセスを促進することができます。If the default set of options is not enough, you can drive the linking process with an XML file that describes what you want from the linker.

型、メソッド、フィールドがアプリケーションから削除されないように、追加の定義をリンカーに指定できます。You can provide extra definitions to the linker to ensure the type, methods and/or fields are not eliminated from your application. 独自のコードの場合、推奨される方法は [Preserve] カスタム属性を使用することです。詳細は、「iOS でのリンク」ガイドと「Android でのリンク」ガイドにあります。In your own code the preferred way is to use the [Preserve] custom attribute, as discussed in the Linking on iOS and Linking on Android guides. ただし、SDK またはプロダクト アセンブリからの定義をいくつか必要とする場合、(必要な要素がリンカーによって削除されないコードの追加よりも) XML ファイルの利用が最適な解決策となることがあります。However if you need some definitions from the SDK or product assemblies then using an XML file might be your best solution (versus adding code that will ensure the linker won't eliminate what you need).

これを行うには、最上位要素 <linker> で XML ファイルを定義します。この要素にはアセンブリ ノードが含まれ、アセンブリ ノードにはノードが含まれ、型ノードにはメソッド ノードとフィールド ノードが含まれます。To do this, you define an XML file with the top-level element <linker> which contains assembly nodes which in turn contain type nodes, which in turn contain method and field nodes.

このリンカー記述ファイルが与えられたら、それをプロジェクトに追加し、次の操作を行います。Once you have this linker description file, add it to your project and:

  • Android の場合: [ビルド アクション]LinkDescription に設定しますFor Android : set the Build Action to LinkDescription
  • iOS の場合: [ビルド アクション]LinkDescription に設定しますFor iOS : set the Build Action to LinkDescription

次の例では、XML ファイルがどのようなものであるかを確認できます。The following example shows what the XML file looks like:

<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 (ユーザー コード) アセンブリに適用します。In the above example, the linker will read and apply the instructions on the mscorlib.dll (shipped with Mono for Android) and My.Own.Assembly (user code) assemblies.

最初のセクションは mscorlib.dll の定義ですが、これによって System.Environment 型はフィールド mono_corlib_version とメソッド get_StackTrace を保持します。The first section, for mscorlib.dll, will ensure that the System.Environment type will preserve its field named mono_corlib_version and its get_StackTrace method. リンカーは IL で動作し、C# プロパティを認識しないため、getter または setter メソッドの名前を利用する必要があります。Note the getter and/or setter method names must be used as the linker works on IL and does not understand C# properties.

2 番目のセクションは My.Own.Assembly.dll の定義ですが、これによって型 Foo はすべてのフィールド (すなわち、preserve="fields" 属性) とすべてのコンストラクター (すなわち、IL のすべての .ctor メソッド) を保持します。The second section, for My.Own.Assembly.dll, will ensure that the Foo type will preserve all its fields (i.e. the preserve="fields" attribute) and all its constructors (i.e. all the methods named .ctor in IL). Bar は 1 つのコンストラクター (文字列パラメーターを 1 つ受け取る) のためと特定の文字列フィールド _blah のために特定の署名 (名前ではなく) を保持します。The Bar type will preserve specific signatures (not names) for one constructor (that accepts a single string parameter) and for a specific string field _blah. 名前空間 My.Own.Namespace はそれに含まれているすべての型を保持します。The My.Own.Namespace namespace will preserve all the types it contains. 最後になりますが、完全名 (名前空間を含む) がワイルドカード パターン "My.Other*" に一致する型はすべて、そのすべてのフィールドとメソッドを保持します。Lastly, any type whose full name (including the namespace) matches the wildcard pattern "My.Other*" will preserve all of its fields and methods. ワイルドカード文字 * は "type fullname" パターン内に複数回含めることができます。The wildcard character * can be included multiple times within a "type fullname" pattern.