Пользовательская конфигурация компоновщика

Если набора параметров по умолчанию недостаточно, вы можете выполнить связывание с помощью XML-файла, который описывает требования к компоновщику.

Вы можете предоставить компоновщику дополнительные определения, чтобы он не исключал из приложения определенные типы, методы и (или) поля. В собственном коде лучше всего применить пользовательский атрибут [Preserve], который описан в руководствах Компоновка в iOS и Компоновка в Android. Но если вам нужны несколько определений из сборки пакета SDK или продукта, то лучшим решением будет создать XML-файл (вместо того, чтобы добавлять отдельный код только для того, чтобы компоновщик не удалял нужные элементы).

Этот XML-файл нужно определить с элементом верхнего уровня <linker>, который будет содержать узлы assembly (сборка), в которых будут расположены узлы type (тип), содержащие в свою очередь узлы method (метод) и field (поле).

Создав такой файл с описанием для компоновщика, добавьте его в проект и выполните следующее:

  • Для 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 для Android) и My.Own.Assembly (пользовательский код).

Первый раздел для mscorlib.dll указывает, что тип System.Environment сохранит поле с именем mono_corlib_version и его метод get_StackTrace. Обратите внимание, что здесь нужно указать имена методов считывания и задания, поскольку компоновщик работает с промежуточным языком и не поддерживает свойства C#.

Второй раздел для My.Own.Assembly.dll обеспечит сохранение в типе Foo всех полей (т. е. атрибута preserve="fields") и всех конструкторов (т. е. всех методов с именем .ctor на промежуточном языке). Тип Bar сохранит отдельные сигнатуры (не имена) для одного конструктора (который принимает один строковый параметр) и для конкретного строкового поля _blah. Пространство имен My.Own.Namespace сохранит все типы, которые оно содержит. Наконец, любой тип, полный имя которого (включая пространство имен) соответствует шаблону wild карта шаблон "My.Other*" сохранит все его поля и методы. Подстановочный символ * может встречаться в шаблоне "полное имя типа" несколько раз.