共用方式為


API 集合載入器作業

重要

本主題中的資訊適用於所有 Windows 10 版本及更新版本。 我們將在這裡將這些版本稱為「Windows」,並在必要時呼叫任何例外狀況。

API 集合 依賴連結庫載入器中的OS支援,以有效地將模組命名空間重新導向引入連結庫系結程式。 連結 庫載入器會使用 API 集合合約名稱 來執行參考的運行時間重新導向,以裝載適當實作 API 集合的目標主機二進位檔。

當載入器在運行時間遇到 API 集合的相依性時,載入器會查閱映像中的組態數據,以識別 API 集合的主機二進位檔。 此組態數據稱為 API 集合架構。 架構會組合為OS的屬性,而且API集合和二進位檔之間的對應可能會因指定裝置中包含的二進位檔而有所不同。 架構可讓單一二進位檔中的匯入函式在不同的裝置上正確路由傳送,即使二進位主機的模組名稱已在不同的 Windows 裝置上重新命名或完全重構也一樣。

Windows 支援兩種使用 API 集合和介面的標準技術: 直接轉送反向轉送

直接轉送

在此組態中,取用的程式代碼會直接匯入 API 集合模組名稱。 此匯入會在單一作業中解析,而且是最有效率的方法,且負擔最少。 就概念上講,此解析可能會指向不同 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 計算機上引進的模組名稱,並利用 API 集合系統在所有 Windows 裝置上提供相容性。

載入器作業的行為如下所示:

  1. 在 Windows 電腦以外的裝置上,載入器會顯示裝置上不存在的舊版 Windows 計算機模組名稱相依性。
  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 裝置上執行。