Xamarin.Mac registrar

本文档介绍了 Xamarin.Mac registrar 的用途及其各种用法配置。

概述

Xamarin.Mac 弥合了托管 (.NET) 世界与 Cocoa 运行时之间的差距,允许托管类调用非托管 Objective-C 类,并在发生事件时回调。 执行此“魔法”所需的工作由 registrar 处理,通常在视图中会隐藏。

此注册会对性能产生影响,特别是在应用程序启动时间方面,了解一下“在后台”发生的事情有时会有所帮助。

配置

从根本上讲,registrar 在启动时的工作可以分为两类:

  • 扫描每个托管类以获取从 NSObject 派生的类,并收集要向 Objective-C 运行时公开的项列表。
  • 将此信息注册到 Objective-C 运行时。

随着时间的推移,已创建了三个不同的 registrar 配置来涵盖不同的用例。 每个配置具有不同的生成和运行时结果:

  • 动态 registrar – 在启动期间,使用 .NET 反射扫描每个加载的类型,确定相关项的列表,并通知原生运行时。 此选项在生成时不会消耗时间,但在启动期间计算成本非常高(多达数秒)。
  • 静态 registrar – 在生成期间,计算要注册的项集并生成 Objective-C 代码来处理注册。 在启动期间会调用此代码以快速注册所有项。 这会使生成过程显著延长,但可以大幅缩短应用程序启动时间。
  • “部分”静态 – 较新的“混合”方法,它结合了两者的大部分优点。 由于来自 Xamarin.Mac.dll 的导出项是恒定的,请保存一个预计算的库来处理它们的注册并将其链接到其中。 请使用反射来处理用户库,但由于用户库导出的类型比平台绑定导出的类型少得多,所以这通常相当快。 生成时间影响可忽略,并减少了动态的绝大部分“成本”。

目前,部分静态是调试配置的默认值,静态是发布配置的默认值。

存在一些场景:

  • 在启动后使用从 NSObject 派生的类加载了插件
  • 动态创建了从 NSObject 派生的类实例

其中,registrar 无法知晓它在启动时需要注册某个类型。 将提供 ObjCRuntime.Runtime.RegisterAssembly 方法来通知 registrar 它有其他类型需要考虑。