分享方式:


建置 C/C++ 並存組件

並存元件 是一組資源集合,也就是 DLL、windows 類別、COM 伺服器、類型程式庫或介面的群組,可供應用程式在執行時間使用。 重新封裝元件中 DLL 的主要優點是應用程式可以同時使用多個版本的元件,而且在更新版本的情況下,可以服務目前安裝的元件。

C++ 應用程式可能會在應用程式的不同部分使用一或多個 DLL。 在執行時間,DLL 會載入至主要進程,並執行必要的程式碼。 應用程式依賴作業系統來找出要求的 DLL、瞭解哪些其他相依 DLL 必須載入,然後連同要求的 DLL 一起載入。 在 Windows XP、Windows Server 2003 和 Windows Vista 之前的 Windows 作業系統版本上,作業系統載入器會在應用程式的本機資料夾或系統路徑上指定的另一個資料夾搜尋相依 DLL。 在 Windows XP、Windows Server 2003 和 Windows Vista 上,作業系統載入器也可以使用資訊清單 檔來搜尋相依 DLL,並搜尋包含這些 DLL 的並存元件。

根據預設,當 DLL 是使用 Visual Studio 建置時,它會將 應用程式資訊清單 內嵌為識別碼等於 2 的RT_MANIFEST資源。 如同可執行檔,此資訊清單會描述此 DLL 在其他元件上的相依性。 這假設 DLL 不是並存元件的一部分,而相依于此 DLL 的應用程式不會使用應用程式資訊清單來載入它,而是依賴作業系統載入器在系統路徑上尋找此 DLL。

注意

使用應用程式資訊清單將資訊清單內嵌為識別碼等於 2 的資源,這一點很重要。 如果在執行時間動態載入 DLL(例如,使用 LoadLibrary 函式),作業系統載入器會載入 DLL 資訊清單中指定的相依元件。 呼叫期間 LoadLibrary 不會檢查 DLL 的外部應用程式資訊清單。 如果未內嵌資訊清單,載入器可能會嘗試載入不正確的元件版本,或找不到找到相依元件。

一或多個相關的 DLL 可以使用對應的 元件資訊清單 重新封裝成並存元件,其中描述哪些檔案形成元件,以及元件在其他並存元件上的相依性。

注意

如果元件包含一個 DLL,建議將元件資訊清單內嵌到此 DLL 中,做為識別碼等於 1 的資源,並將私用元件命名為 DLL。 例如,如果 DLL 的名稱是 mylibrary.dll,資訊清單之 assemblyIdentity > 元素中使用的 < name 屬性值也可能是 mylibrary。 在某些情況下,當程式庫具有 .dll 以外的副檔名時(例如,MFC ActiveX Controls 專案會建立 .ocx 程式庫),就可以建立外部元件資訊清單。 在此情況下,元件的名稱及其資訊清單必須與 DLL 的名稱不同(例如 MyAssembly、MyAssembly.manifest 和 mylibrary.ocx)。 不過,仍建議將這類程式庫重新命名為 extension.dll,並將資訊清單內嵌為資源,以減少此元件未來的維護成本。 如需作業系統如何搜尋私人元件的詳細資訊,請參閱 元件搜尋順序

這項變更可能會允許將對應的 DLL 部署為 應用程式本機資料夾中的私人元件 ,或部署為 WinSxS 元件快取中的共用元件 。 必須遵循數個步驟,才能達到這個新元件的正確執行時間行為;它們會在建立並存元件 指導方針中 說明。 正確撰寫元件之後,可以將它部署為共用或私人元件,以及相依于它的應用程式。 將並存元件安裝為共用元件時,您可以遵循在 Windows XP 上安裝 Win32 元件以進行並存共用或使用合併模組 中所述 的指導方針。 將並存元件安裝為私人元件時,您可以只將對應的 DLL、資源和元件資訊清單複製到目的電腦上的應用程式本機資料夾,以確保載入器可以在執行時間找到此元件(請參閱 元件搜尋順序 )。 另一種方式是使用 Windows Installer ,並遵循在 Windows XP 上安裝 Win32 元件中針對私人使用應用程式中所述 的指導方針。

另請參閱

建置C/C++ 隔離應用程式
建置 C/C++ 隔離應用程式和並存組件