共用方式為


建置 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++ 隔離應用程式和並存組件