如果預設的一組選項不足以滿足需求,您可以利用描述對連結器有何需求的 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 for Android) 和 My.Own.Assembly (使用者程式碼) 組件上的指示。
第一個區段 (適用於 mscorlib.dll) 將可確保 System.Environment 類型會保留其名為 mono_corlib_version 的欄位及其 get_StackTrace 方法。
請注意,getter 和 (或) setter 方法名稱必須用來作為 IL 上的連結器工作,而不會理解 C# 屬性。
第二個區段 (適用於 My.Own.Assembly.dll) 將可確保 Foo 類型會保留其所有欄位 (亦即 preserve="fields" 屬性) 及其所有建構函式 (亦即 IL 中所有名為 .ctor 的方法)。 Bar 類型會針對一個建構函式 (此建構函式會接受單一字串參數) 和針對特定字串欄位 _blah 保留特定的簽章 (不是名稱)。
My.Own.Namespace 命名空間會保留其包含的所有類型。
最後,其完整名稱(包括命名空間)符合通配符模式 「My.Other*」 的任何類型,都會保留其所有字段和方法。 萬用字元 * 可以多次包含在 "type fullname" 模式中。