Configurazione personalizzata del linker
Se il set predefinito di opzioni non è sufficiente, è possibile gestire il processo di collegamento con un file XML che descrive la configurazione desiderata per il linker.
È possibile fornire definizioni aggiuntive al linker per impedire che il tipo, determinati metodi e/o determinati campi vengano eliminati dall'applicazione. Nel codice l'approccio consigliato consiste nell'usare l'attributo personalizzato [Preserve]
, come descritto nelle guide Collegamento in iOS e Collegamento in Android.
Tuttavia, se sono necessarie definizioni dagli assembly SDK o di prodotto, l'uso di un file XML può essere la soluzione migliore, rispetto all'aggiunta di codice che impedisca al linker di eliminare elementi necessari.
A questo scopo, definire un file XML con l'elemento di primo livello <linker>
che contiene nodi assembly, che a loro volta contengono nodi type, che contengono infine nodi method e field.
Quando questo file di descrizione del linker è disponibile, aggiungerlo al progetto e quindi:
- Per Android: impostare Azione di compilazione su LinkDescription
- Per iOS: impostare Azione di compilazione su LinkDescription
L'esempio seguente mostra che aspetto avrà il file 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>
Nell'esempio precedente il linker leggerà e applicherà le istruzioni negli assembly mscorlib.dll
(forniti con Mono per Android) e My.Own.Assembly
(codice utente).
La prima sezione, per mscorlib.dll
, fa sì che il tipo System.Environment
mantenga il campo denominato mono_corlib_version
e il metodo get_StackTrace
.
Si noti che è necessario usare i nomi dei metodi getter e/o setter, perché il linker funziona con IL e non riconosce le proprietà C#.
La seconda sezione, per My.Own.Assembly.dll
, fa sì che il tipo Foo
mantenga tutti i campi, ovvero l'attributo preserve="fields"
, e tutti i costruttori, ovvero tutti i metodi denominati .ctor
in IL. Il tipo Bar
manterrà firme specifiche (non i nomi) per un costruttore (che accetta un solo parametro stringa) e per un campo stringa _blah
specifico.
Lo spazio dei nomi My.Own.Namespace
manterrà tutti i tipi che contiene.
Infine, qualsiasi tipo il cui nome completo (incluso lo spazio dei nomi) corrisponde al modello con caratteri jolly "My.Other*" manterrà tutti i relativi campi e metodi. Il carattere jolly *
può essere incluso più volte all'interno di un modello "type fullname".