Visual Studio 安裝程式會將共享程式庫放置在稱為「並列緩存」的特定位置(%systemroot%\WinSxS),該目錄僅授予 SYSTEM 與 Administrators 群組寫入權限,一般使用者僅具讀取與執行權限。瞭解如何正確利用這項機制,對於開發混合模式應用程式至關重要。
當使用 /clr 編譯 C++/CLI 程式庫並由 C# 應用程式參考時,執行可能會拋出 System.IO.FileNotFoundException(HRESULT 0x8007007E),錯誤代碼 126 對應 ERROR_MOD_NOT_FOUND。這表示 Windows 無法尋找所需的非托管 DLL(如 msvcr80.dll、msvcm80.dll),儘管這些檔案確實存在於系統中——只是不在預期的 System32 目錄下。
WinSxS 目錄下的每個非托管組件皆擁有獨立目錄,命名包含版本號與公開金鑰權杖(如 x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd)。組件內容由 .manifest XML 檔案描述,並透過 .cat 安全性目錄檔驗證雜湊值,防止竄改。
使用非托管組件的模組必須擁有資訊清單,指定所需組件的精確版本。鏈接器會產生 lib.dll.manifest,但 Windows 對 DLL 忽略外部資訊清單檔,必須將其嵌入為資源 ID 為 2 的 RT_MANIFEST 非托管資源。兩種嵌入方式:
rc.exe 與 link.exe 嵌入。mt.exe 隱藏選項:mt /manifest lib.dll.manifest /outputresource:lib.dll;#2(Visual Studio 2005 內建採用此法)。嵌入後,Windows 即可正確載入對應版本的並列組件,程式即可正常執行。
資訊清單中指定的版本(如 8.0.50608.0)可能與實際安裝版本(8.0.50727.42)不同。WinSxS 的 Policies 目錄下的策略檔(如 8.0.50727.42.policy)定義了 bindingRedirect,將舊版本區間重導向至新版本。此機制僅允許組建/修訂號變更,不支援主/次版本號變更。
Visual Studio 2005 引入的並列組件機制改變了 DLL 載入行為。建議採用雙重鏈接法嵌入資訊清單,因若需簽署強名稱組件,第二次鏈接可指定金鑰檔;使用 mt.exe 會破壞強名稱簽章導致組件無法載入。原生 C++ 專案若使用 MFC/ATL/CRT 共享程式庫,同樣需嵌入資訊清單至可執行檔。