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 其有其他要考慮的類型。