自定义链接器配置
如果默认的选项集不够,可以使用描述从链接器获取所需内容的 XML 文件驱动链接过程。
你可以提供链接器的额外定义,以确保不会消除应用程序中的类型、方法和/或字段。 在你自己的代码中,首选方式是使用 [Preserve]
自定义特性,如在 iOS 上链接和在 Android 上链接指南中所述。
但是,如果你需要一些来自 SDK 或产品程序集中的定义,则使用 XML 文件可能是最好的解决方案(而不是添加确保链接器不会消除所需内容的代码)。
若要执行此操作,可以使用顶级元素 <linker>
定义 XML 文件,它包括反过来包括类型节点的程序集节点,它又包括方法和字段节点。
拥有此链接器说明文件后,将其添加到项目并执行下列操作:
- 对于 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”模式内多次包含通配符 *
。