Konfigurasi Linker Kustom
Jika kumpulan opsi default tidak cukup, Anda dapat mendorong proses penautan dengan file XML yang menjelaskan apa yang Anda inginkan dari linker.
Anda dapat memberikan definisi tambahan ke linker untuk memastikan jenis, metode, dan/atau bidang tidak dihilangkan dari aplikasi Anda. Dalam kode Anda sendiri, cara yang disukai adalah menggunakan [Preserve]
atribut kustom, seperti yang dibahas dalam panduan Menautkan di iOS dan Menautkan di Android .
Namun jika Anda memerlukan beberapa definisi dari SDK atau rakitan produk, maka menggunakan file XML mungkin merupakan solusi terbaik Anda (versus menambahkan kode yang akan memastikan linker tidak akan menghilangkan apa yang Anda butuhkan).
Untuk melakukan ini, Anda menentukan file XML dengan elemen <linker>
tingkat atas yang berisi simpul rakitan yang pada gilirannya berisi node jenis , yang pada gilirannya berisi metode dan simpul bidang .
Setelah Anda memiliki file deskripsi linker ini, tambahkan ke proyek Anda dan:
- Untuk Android : atur Tindakan Build ke LinkDescription
- Untuk iOS : atur Tindakan Build ke LinkDescription
Contoh berikut menunjukkan seperti apa 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>
Dalam contoh di atas, linker akan membaca dan menerapkan instruksi pada mscorlib.dll
rakitan (dikirim dengan Mono untuk Android) dan My.Own.Assembly
(kode pengguna).
Bagian pertama, untuk mscorlib.dll
, akan memastikan bahwa System.Environment
jenis akan mempertahankan bidangnya bernama mono_corlib_version
dan metodenya get_StackTrace
.
Perhatikan nama metode getter dan/atau setter harus digunakan karena linker berfungsi di IL dan tidak memahami properti C#.
Bagian kedua, untuk My.Own.Assembly.dll
, akan memastikan bahwa Foo
jenis akan mempertahankan semua bidangnya (yaitu preserve="fields"
atribut) dan semua konstruktornya (yaitu semua metode yang dinamai .ctor
dalam IL). Jenis ini Bar
akan mempertahankan tanda tangan tertentu (bukan nama) untuk satu konstruktor (yang menerima parameter string tunggal) dan untuk bidang _blah
string tertentu .
Namespace My.Own.Namespace
layanan akan mempertahankan semua jenis yang dikandungnya.
Terakhir, jenis apa pun yang nama lengkapnya (termasuk namespace layanan) cocok dengan pola kartubebas "My.Other*" akan mempertahankan semua bidang dan metodenya. Karakter *
kartubebas dapat disertakan beberapa kali dalam pola "ketik fullname".