次の方法で共有


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 メソッドを指定します。