包含此页的版本:
不含此页的版本:
可以使用注释来防止 Unity 链接器剥离代码的特定部分。如果您的应用程序生成的运行时代码在 Unity 执行静态分析时不存在,这将很有用;例如,通过反思。批注要么向 Unity 链接器提供有关不应剥离哪些代码模式的一般指导,要么提供不剥离特定定义的代码部分的说明。
可以使用两种广泛的方法来批注代码,以使其免受托管代码剥离过程的影响:
这些技术中的每一种都可以更好地控制 Unity 链接器在更高的剥离级别剥离的代码量,并减少重要代码被剥离的机会。当代码通过反射引用其他代码时,批注特别有用,因为 Unity 链接器并不总是可以检测反射的使用。
保留使用反射或在运行时生成其他代码的代码,以显着降低应用程序执行时出现意外行为的可能性。有关 Unity 链接器可以识别的反射模式示例,请参阅 Unity 中间语言链接器反射测试套件。
根批注强制 Unity 链接器将代码元素视为根元素,这些元素不会在代码剥离过程中被剥离。可以使用两种类型的根注释,具体取决于是否需要保留单个类型及其构造函数或程序集:
使用[Preserve]属性,从 Unity 链接器的静态分析中单独排除代码的特定部分。要使用此属性注释一段代码,请添加[Preserve]紧接在要保留的代码的第一部分之前。以下列表描述了当您使用[Preserve]属性:
[Preserve]属性添加到程序集,则将属性声明放在程序集中包含的任何 C# 文件中,在任何命名空间声明之前。[add]访问器,以及[remove]访问。使用[Preserve]属性,当您想要同时保留类型及其默认构造函数时。如果您想保留其中一个或另一个,但不能同时保留两个,请使用link.xml文件。
您可以定义[Preserve]属性。您可以使用PreserveAttribute类,创建它的子类,或创建您自己的类。例如:
class Foo
{
[Preserve]
public void PreservedMethod(){}
}
您可以包含.xml一个名为link.xml以保留特定程序集或程序集零件的列表。这link.xml文件必须存在于Assets文件夹或Assets文件夹,并且必须包含<linker>标记。Unity 链接器处理保留在link.xmlfile 作为根类型。
您可以使用任意数量的link.xml文件。因此,您可以为每个插件在 Unity 外部创建的一组代码,用于在 Unity 中创建功能。可以在 Unity 中使用两种插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和本机插件(特定于平台的本机代码库)。更多信息
请参阅术语表.您不能包含link.xml文件,但可以从非包引用包程序集link.xml文件。
有关如何格式化link.xml文件,请参阅链接 XML 格式参考。
依赖关系注释定义各种代码元素之间的依赖关系。这些批注对于保留 Unity 链接器无法静态分析的代码模式(例如反射)非常有用。这些注释还确保当没有根元素使用这些代码元素时,它们不会被错误地保留。可以使用两种方法来更改 Unity 链接器处理代码元素的方式:
这[Preserve]属性对于始终需要 API 的情况很有用。其他属性对于更一般的保存很有用。例如,您可以通过使用[RequireImplementorsAttribute].
要注释特定的编码模式,请使用以下一个或多个属性:
RequireImplementorsAttribute:将实现此接口的所有类型标记为依赖项。RequireDerivedAttribute:将派生自此类型的所有类型标记为依赖项。RequiredInterfaceAttribute:将类型上的接口实现标记为依赖项。RequiredMemberAttribute:将类型的所有成员标记为依赖项。RequireAttributeUsagesAttribute:将自定义属性标记为依赖项。可以通过各种方式组合这些属性,以更精确地控制 Unity 链接器如何保留代码。
这[AlwaysLinkAssembly]属性强制 Unity 链接器搜索程序集,而不管该程序集是否由生成中包含的另一个程序集引用。只能将属性应用于装配。
该属性不会直接保留程序集中的代码。相反,此属性指示 Unity 链接器将根标记规则应用于程序集。如果没有代码元素与程序集的根标记规则匹配,Unity 链接器仍会从生成中删除程序集。
在包含一个或多个方法的预编译程序集或包程序集上使用此属性,其中包含[RuntimeInitializeOnLoadMethod]属性,但可能不包含直接或间接在任何场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表在项目中。
如果程序集定义了[assembly: AlwaysLinkAssembly]并且还被构建中包含的另一个程序集引用,则该属性对输出没有影响。