Xamarin.Mac registrar
"このドキュメントでは、Xamarin.Mac registrar の目的とそのさまざまな使用構成について説明します。"
概要
Xamarin.Mac は、マネージド (.NET) ワールドと Cocoa のランタイムの間のギャップを埋め、マネージド クラスがアンマネージ Objective-C クラスを呼び出し、イベントが発生したときにマネージド クラスをコールバックできるようにします。 この "マジック" を実行するために必要な作業は、registrar によって処理され、通常はビューに表示されません。
この登録はパフォーマンス (特にアプリケーションの起動時間) に影響を与えるため、"内部で" 起こっていることを少し理解すると役立つ場合があります。
構成
基本的に、起動時の registrar のジョブは、次の 2 つのカテゴリに分けることができます。
- すべてのマネージド クラスをスキャンして NSObject から派生したものを見つけ出し、Objective-C ランタイムに公開される項目の一覧を収集する。
- この情報を Objective-C ランタイムに登録する。
時間の経過と共に、さまざまなユースケースに対応する次の 3 つの異なる registrar 構成が作成されました。 それぞれのビルドと実行時の結果は異なります。
- 動的 registrar – 起動時、.NET リフレクションを使用して、読み込まれたすべての型をスキャンし、関連する項目の一覧を決定して、ネイティブ ランタイムに通知します。 このオプションを使用すると、ビルドに追加される時間は 0 ですが、起動時のコンピューティングに非常にコストがかかります (最大数秒)。
- 静的 registrar – ビルド時、登録する項目のセットを計算し、登録を処理する Objective-C コードを生成します。 このコードは起動時に呼び出され、すべての項目をすばやく登録します。 ビルドの一時停止時間はかなり長くなりますが、アプリケーションの起動時間を大幅に短縮できます。
- "部分的に" 静的 – 両方の利点の大半を提供する新しい "ハイブリッド" アプローチ。 Xamarin.Mac.dll からのエクスポートは一定であるため、事前計算済みライブラリを保存して、エクスポートの登録を処理し、リンクします。 ユーザー ライブラリはリフレクションを使用して処理されますが、ユーザー ライブラリによってエクスポートされる型は、プラットフォームのバインディングよりもはるかに少ないため、多くの場合、これはかなり高速です。 ビルド時間の影響は無視できる程度であり、動的な場合の "コスト" の大部分が削減されます。
現在、"部分的に静的" はデバッグ構成の既定値であり、"静的" はリリース構成の既定値です。
いくつかのシナリオがあります。
- NSObject から派生したクラスで起動後に読み込まれるプラグイン
- NSObject から派生して動的に作成されたクラス インスタンス
この場合、registrar は、起動時に何らかの型を登録する必要があることを認識できません。 考慮すべき追加の型があることを registrar に通知するには、ObjCRuntime.Runtime.RegisterAssembly
メソッドを指定します。