Configuration personnalisée de l’éditeur de liens

Si l’ensemble d’options par défaut ne suffit pas, vous pouvez piloter le processus de liaison avec un fichier XML décrivant ce que vous voulez faire faire à l’éditeur de liens.

Vous pouvez fournir à l’éditeur de liens des définitions supplémentaires pour garantir que le type, les méthodes et/ou les champs ne sont pas éliminés de votre application. Dans votre propre code, le meilleur moyen consiste à utiliser l’attribut personnalisé [Preserve], tel que décrit dans les guides Liaison sur iOS et Liaison sur Android. Toutefois si vous avez besoin de définitions issues du Kit de développement logiciel (SDK) ou des assemblys du produit, l’utilisation d’un fichier XML est sans doute la meilleure solution (contrairement à l’ajout de code qui permettra d’assurer que l’éditeur de liens n’éliminera pas ce dont vous avez besoin).

Pour ce faire, définissez un fichier XML avec l’élément de niveau supérieur <linker> qui contient les nœuds assembly contenant à leur tour les nœuds type, contenant pour leur part les nœuds méthode et champ.

Une fois que vous avez ce fichier de description de l’éditeur de liens, ajoutez-le à votre projet et :

  • Pour Android : définissez l’action de génération sur LinkDescription
  • Pour iOS : définissez l’action de génération sur LinkDescription

L’exemple suivant montre à quoi ressemble le fichier 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>

Dans l’exemple ci-dessus, l’éditeur de liens lit et applique les instructions sur les assemblys mscorlib.dll (livrés avec Mono pour Android) et My.Own.Assembly (code utilisateur).

La première section, pour mscorlib.dll, permet de garantir que le type System.Environment conserve son champ nommé mono_corlib_version et sa méthode get_StackTrace. Notez que les noms de la méthode getter et/ou setter doivent être utilisés tandis que l’éditeur de liens fonctionne sur le langage IL sans comprendre des propriétés de C#.

La seconde section, pour My.Own.Assembly.dll, permet de garantir que le type Foo conserve tous ses champs (par ex. l’attribut preserve="fields") et tous ses constructeurs (par ex. toutes les méthodes nommées .ctor dans IL). Le type Bar conserve des signatures spécifiques (pas de noms) pour un constructeur (qui accepte un paramètre de chaîne unique) et pour un champ de chaîne spécifique _blah. L’espace de noms My.Own.Namespace permet de conserver tous les types qu’il contient. Enfin, tout type dont le nom complet (y compris l’espace de noms) correspond au modèle générique « My.Other* » conserve tous ses champs et méthodes. Le caractère générique * peut être inclus plusieurs fois dans un modèle de « nom complet de type ».