Version: 6000.3
语言: 中文
配置托管代码剥离
链接 XML 格式参考

使用注释保留代码

可以使用注释来防止 Unity 链接器剥离代码的特定部分。如果您的应用程序生成的运行时代码在 Unity 执行静态分析时不存在,这将很有用;例如,通过反思。批注要么向 Unity 链接器提供有关不应剥离哪些代码模式的一般指导,要么提供不剥离特定定义的代码部分的说明。

可以使用两种广泛的方法来批注代码,以使其免受托管代码剥离过程的影响:

  • 根注释将代码的各个部分标识为根。Unity 链接器不会剥离任何标记为根的代码。根注释使用起来不太复杂,但也可能导致 Unity 链接器保留一些它应该剥离的代码。
  • 依赖关系注释定义代码元素之间的连接。与根注解相比,依赖注解可以减少不必要的代码保留。

这些技术中的每一种都可以更好地控制 Unity 链接器在更高的剥离级别剥离的代码量,并减少重要代码被剥离的机会。当代码通过反射引用其他代码时,批注特别有用,因为 Unity 链接器并不总是可以检测反射的使用。

保留使用反射或在运行时生成其他代码的代码,以显着降低应用程序执行时出现意外行为的可能性。有关 Unity 链接器可以识别的反射模式示例,请参阅 Unity 中间语言链接器反射测试套件

根注释

根批注强制 Unity 链接器将代码元素视为根元素,这些元素不会在代码剥离过程中被剥离。可以使用两种类型的根注释,具体取决于是否需要保留单个类型及其构造函数或程序集:

  • 保留属性:将单个类型作为根进行注释以保留它们。
  • Link.xml:将程序集以及这些程序集中的任何类型或其他代码实体作为根进行批注以保留它们。

使用 Preserve 属性注释根

使用[Preserve]属性,从 Unity 链接器的静态分析中单独排除代码的特定部分。要使用此属性注释一段代码,请添加[Preserve]紧接在要保留的代码的第一部分之前。以下列表描述了当您使用[Preserve]属性:

  • 程序集:保留程序集中使用和定义的所有类型。要分配[Preserve]属性添加到程序集,则将属性声明放在程序集中包含的任何 C# 文件中,在任何命名空间声明之前。
  • 类型:保留类或类型及其默认构造函数。
  • 方法:保留方法、声明方法的类型、方法返回的类型及其所有参数的类型。
  • 属性:保留属性、声明属性的类型、属性的值类型以及获取和设置属性值的方法。
  • 字段:保留字段、字段类型和声明字段的类型。
  • 事件:保留事件、声明事件的类型、类型、事件返回的类型、[add]访问器,以及[remove]访问。
  • 委托:保留委托类型和委托调用的所有方法。

使用[Preserve]属性,当您想要同时保留类型及其默认构造函数时。如果您想保留其中一个或另一个,但不能同时保留两个,请使用link.xml文件。

您可以定义[Preserve]属性。您可以使用PreserveAttribute类,创建它的子类,或创建您自己的类。例如:

class Foo
{
    [Preserve]
    public void PreservedMethod(){}
}

使用 Link XML 文件注释根

您可以包含.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 链接器处理代码元素的方式:

  • 批注属性:这些属性指示 Unity 链接器应保留特定的代码模式,例如派生自批注类型的任何类型。
  • AlwaysLinkAssemblyAttribute:使用此属性指示 Unity 链接器应处理程序集,即使项目中的任何其他程序集未引用该程序集也是如此。

注释属性

[Preserve]属性对于始终需要 API 的情况很有用。其他属性对于更一般的保存很有用。例如,您可以通过使用[RequireImplementorsAttribute].

要注释特定的编码模式,请使用以下一个或多个属性:

可以通过各种方式组合这些属性,以更精确地控制 Unity 链接器如何保留代码。

AlwaysLinkAssembly 属性

[AlwaysLinkAssembly]属性强制 Unity 链接器搜索程序集,而不管该程序集是否由生成中包含的另一个程序集引用。只能将属性应用于装配。

该属性不会直接保留程序集中的代码。相反,此属性指示 Unity 链接器将根标记规则应用于程序集。如果没有代码元素与程序集的根标记规则匹配,Unity 链接器仍会从生成中删除程序集。

在包含一个或多个方法的预编译程序集或包程序集上使用此属性,其中包含[RuntimeInitializeOnLoadMethod]属性,但可能不包含直接或间接在任何场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
在项目中。

如果程序集定义了[assembly: AlwaysLinkAssembly]并且还被构建中包含的另一个程序集引用,则该属性对输出没有影响。

其他资源

配置托管代码剥离
链接 XML 格式参考