Xamarin.Mac registrar

本文件說明 Xamarin.Mac registrar 及其不同使用方式設定的用途。

概觀

Xamarin.Mac 會橋接 Managed (.NET) 世界與 Cocoa 執行時間之間的差距,讓 Managed 類別呼叫 Unmanaged Objective-C 類別,並在事件發生時被呼叫回來。 預先格式化此「魔術」所需的工作是由 registrar 處理,而且通常是隱藏在檢視中。

此註冊有效能影響,特別是對應用程式啟動時間的影響,並瞭解一些“下底下”可能有説明的事情。

組態

基本上 registrar,在啟動時的工作可以分成兩個分類:

  • 掃描每個 Managed 類別中衍生自 NSObject 的類別,並收集要公開給 Objective-C 運行時間的項目清單。
  • 向 Objective-C 運行時間註冊這項資訊。

經過一段時間,已建立三個不同的 registrar 組態,以涵蓋不同的使用案例。 每個都有不同的建置和運行時間後果:

  • 動態 registrar – 在啟動期間,使用 .NET 反映掃描每個載入的類型、判斷相關項目的清單,以及通知原生運行時間。 此選項會在組建中新增零時間,但在啟動期間計算成本很高(最多數秒)。
  • Static registrar – 在建置期間,計算要註冊的專案集,併產生 Objective-C 程式代碼來處理註冊。 此程式代碼會在啟動期間叫用,以快速註冊所有專案。 新增大量暫停來建置,但可以從應用程式啟動縮短大量的時間。
  • 「部分」靜態 – 較新的「混合式」方法,可帶來兩者的大部分優點。 由於Xamarin.Mac.dll的導出是常數,因此請儲存預先計算的連結庫來處理其註冊並連結。 使用反映來處理用戶連結庫,但隨著用戶連結庫導出的型別,平臺系結通常相當快速。 可忽略的建置時間影響,並降低大部分動態的「成本」。

目前部分靜態是偵錯組態的預設值,而 Static 是發行組態的預設值。

在某些情況下:

  • 使用衍生自 NSObject 的類別啟動後載入的外掛程式
  • 動態建立的類別實例衍生自 NSObject

registrar其中 無法知道它必須在啟動時註冊某些類型。 會 ObjCRuntime.Runtime.RegisterAssembly 提供方法,告知 registrar 其有其他要考慮的類型。