次の方法で共有


API セット ローダー操作

大事な

このトピックの情報は、Windows 10 以降のすべてのバージョンに適用されます。 ここでは、これらのバージョンを "Windows" と呼び、必要に応じて例外を呼び出します。

API セット ライブラリ ローダーの OS サポートに依存して、ライブラリ バインド プロセスにモジュール名前空間のリダイレクトを効果的に導入します。 API セット コントラクト名 は、API セットの適切な実装を含むターゲット ホスト バイナリへの参照のランタイム リダイレクトを実行するためにライブラリ ローダーによって使用されます。

ローダーが実行時に API セットへの依存関係を検出すると、ローダーはイメージ内の構成データを参照して、API セットのホスト バイナリを識別します。 この構成データは、API セット スキーマと呼ばれます。 スキーマは OS のプロパティとしてアセンブルされ、特定のデバイスに含まれるバイナリによって API セットとバイナリ間のマッピングが異なる場合があります。 このスキーマを使用すると、バイナリ ホストのモジュール名の名前が変更されたか、別の Windows デバイスで完全にリファクタリングされた場合でも、1 つのバイナリ内のインポートされた関数を異なるデバイスで正しくルーティングできます。

Windows では、API セットを使用してインターフェイスする 2 つの標準的な手法がサポートされています。ダイレクト 転送逆転送です。

直接転送

この構成では、使用するコードによって API セットモジュール名が直接インポートされます。 このインポートは 1 回の操作で解決され、オーバーヘッドが最も少ない最も効率的な方法です。 概念的には、この解決策は、次の例に示すように、異なる Windows デバイス上の異なるバイナリを指している可能性があります。

インポートされた API セット: api-feature1-l1-1-0.dll

  • Windows PC ->feature1.dll
  • HoloLens ->feature1_holo.dll
  • IoT ->feature1_iot.dll

マッピングはカスタム スキーマ データ リポジトリに保持されるため、.dll で終わる API セット名はディスク上のファイルを直接参照しないことを意味します。 API セット名の .dll 部分は、ローダーで必要な規則にすぎません。 API セット名は、物理 DLL ファイルのエイリアスまたは仮想名に似ています。 これにより、Windows デバイスの範囲全体で名前が移植可能になります。

逆転送

API セット名は、デバイス間のモジュールに安定した名前空間を提供しますが、すべてのバイナリをこの新しいシステムに変換することは必ずしも実用的であるとは限りません。 たとえば、アプリケーションは長年にわたって一般的に使用されており、アプリケーションのバイナリを再コンパイルすることは不可能な場合があります。 さらに、一部のアプリケーションは、特定の API セットが導入される前にビルドされたシステムで引き続き実行する必要がある場合があります。

このレベルの互換性に対応するために、win32 API サーフェスのサブセットをカバーするすべての Windows デバイスで、フォワーダー のシステムが提供されます。 これらのフォワーダーは、Windows PC で導入されたモジュール名を使用し、API セット システムを利用して、すべての Windows デバイス間で互換性を提供します。

ローダー操作は次のように動作します。

  1. Windows PC 以外のデバイスでは、ローダーには、デバイスに存在しないレガシ Windows PC モジュール名の依存関係が表示されます。
  2. ローダーは、このモジュールの API セット フォワーダーを検索し、メモリに読み込みます。
  3. フォワーダーには、呼び出される特定の関数の API セットのマッピングがあります。
  4. ローダーは、指定されたデバイスの適切なホスト バイナリを見つけます。

概念的には、マッピングは次のようになります。

インポートされた DLL: feature1.dll

  • Windows PC ->feature1.dll
  • HoloLens ->feature1.dll フォワーダー ->api-feature1-l1-1-0.dll ->feature1_holo.dll
  • IoT ->feature1.dll フォワーダー ->api-feature1-l1-1-0.dll ->feature1_iot.dll

最終的な結果は、ダイレクト 転送と機能的には同じですが、アプリケーションの互換性を最大化する方法で実現します。

手記

逆転送では、Win32 API サーフェスのサブセットに対してのみカバレッジが提供されます。 デスクトップ バージョンの Windows を対象とするアプリケーションをすべての Windows デバイスで実行することはできません。