Version: 6000.3
语言: 中文
托管代码剥离
配置托管代码剥离

托管代码剥离和 Unity 链接器

Unity 生成过程使用名为 Unity 链接器的工具来剥离托管代码。Unity 链接器是自定义为与 Unity 配合使用的 IL 链接器版本。特定于 Unity 引擎的 Unity 链接器的自定义部分不公开可用。

Unity 链接器负责托管代码剥离和引擎代码剥离过程的一部分,这是一个单独的过程,可通过IL2CPPUnity 开发的脚本后端,在为某些平台构建项目时,可以将其用作 Mono 的替代品。更多信息
请参阅术语表
删除未使用的引擎代码的脚本后端。有关更多信息,请参阅PlayerSettings.StripEngineCode.

Unity 链接器如何剥离程序集

生成 Unity 项目时,生成过程会将 C# 代码编译为称为通用中间语言 (CIL) 的 .NET 字节码格式。Unity 将此 CIL 字节码打包到称为程序集的文件中。.NET Framework 库和插件Unity 外部创建的一组代码,用于在 Unity 中创建功能。可以在 Unity 中使用两种类型的插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和本机插件(特定于平台的本机代码库)。详细信息
请参阅术语表
您在项目中使用的也预打包为 CIL 字节码的程序集。

出于托管代码剥离的目的,程序集分类如下:

  • .NET 类库程序集:包括 Mono 类库,例如mscorlib.dllSystem.dll,以及 .NET 类库外观程序集,例如netstandard.dll.
  • 平台 SDK 程序集:包括特定于平台 SDK 的托管程序集。例如,windows.winmd程序集,这是通用 Windows 平台 SDK 的一部分。
  • Unity 引擎模块程序集:包括构成 Unity 引擎的托管程序集,例如UnityEngine.Core.dll.
  • 项目程序集:包括特定于项目的程序集,例如:
    • 脚本程序集,例如Assembly-CSharp.dll.
    • 预编译程序集。
    • 装配定义装配
    • 包装组件。

通常,项目中不属于这些类别之一的任何程序集都不会由 Unity 链接器处理,并且会从 Player 生成中排除。

在生成期间,Unity 链接器处理所有适用类型的程序集并执行以下作:

  1. 根据适用于程序集类型和配置的代码剥离级别的根标记规则标记根类型、方法、属性和字段。
  2. 分析它已标记的根以标识,并根据适用的依赖关系标记规则标记这些根所依赖的任何托管代码。
  3. 从程序集中删除任何剩余的未标记代码,因为应用程序代码的任何执行路径都无法访问。

编辑方法主体

“高离”级别,Unity 链接器编辑方法正文以进一步减小代码大小。Unity 链接器仅编辑 .NET 类库程序集中的方法正文。

Unity 链接器可以通过以下方式编辑方法正文:

  • 删除无法访问的分支:if检查System.Environment.OSVersion.Platform并且对于当前目标平台无法访问。
  • 仅访问字段的内联方法:将对获取或设置字段的方法的调用替换为直接访问字段的方法。这通常可以完全剥离该方法。使用 Mono 脚本后端时,Unity 链接器仅在允许方法的调用方根据字段的可见性直接访问字段时进行此更改。对于 IL2CPP,可见性规则不适用,因此 Unity 链接器会在适当的情况下进行此更改。
  • 仅返回const价值。
  • 删除对空且具有void返回类型。
  • 删除try-finallyfinally块为空。删除空调用可能会创建空调用finally块。在方法编辑期间发生这种情况时,Unity 链接器会删除整个try-finally块。可能发生这种情况的一种情况是当编译器生成try-finally块作为foreach循环,以便调用Dispose.

注意:编辑方法体后,程序集的源代码不再与程序集中的编译代码匹配,这会使调试更加困难。

其他资源

托管代码剥离
配置托管代码剥离