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 forwarder ->api-feature1-l1-1-0.dll ->feature1_holo.dll
  • IoT ->feature1.dll フォワーダー ->api-feature1-l1-1-0.dll ->feature1_iot.dll

最終的な結果は、直接転送と機能的には同じですが、アプリケーションの互換性を最大限に高める方法で実現されます。

Note

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