由于應用程序配置不正確,應用程序未能啟動,重新安裝
由于應用程序配置不正確,應用程序未能啟動,重新安裝
1.如果找不到依賴庫,則加載 C/C++ 應用程序可能會失敗。 本文介紹 C/C++ 應用程序未能加載的一些常見原因,并提供了用于解決問題的建議步驟。
2.如果應用程序未能加載的原因是其清單指定了對某個并行程序集的依賴項,而該程序集未作為私有程序集安裝在可執行文件所在的文件夾中,也未安裝在 %WINDIR%WinSxS 文件夾中的本機程序集緩存中,則可能會顯示以下錯誤消息之一(具體取決于嘗試運行應用的 Windows 的版本)。
3.應用程序正常初始化(0xc0000135)失敗。
4.由于應用程序配置不正確,應用程序未能啟動。 重新安裝應用程序可能會糾正這個問題。
5.系統無法執行指定的程序。
由于應用程序配置不正確,應用程序未能啟動,重新安裝6.如果應用程序沒有清單,并且依賴于 Windows 在典型搜索位置找不到的 DLL,則可能會顯示類似于下面這樣的錯誤消息: 沒有找到所需 DLL,因此這個應用程序未能啟動。 重新安裝應用程序可能會修復此問題。
7.如果應用程序部署在未安裝 Visual Studio 的計算機上,并且它在出現類似于以上消息的錯誤消息的情況下崩潰,請檢查以下內容:
8.按照理解 Visual C++ 應用程序的依賴項中介紹的步驟執行。 Dependency Walker 可以顯示應用程序或 DLL 的大多數依賴項。 如果觀察到某些 DLL 缺失,請在嘗試運行應用程序的計算機上安裝它們。
9.操作系統加載程序會使用應用程序清單加載應用程序所依賴的程序集。 清單可以作為資源嵌入在二進制文件中,或作為單獨文件安裝在應用程序文件夾中。 若要檢查清單是否嵌入在二進制文件中,請在 Visual Studio 中打開二進制文件,然后在其資源列表中查找 RT_MANIFEST。 如果找不到嵌入的清單,請在應用程序文件夾中查找名稱類似于 ..manifest 的文件。
10.如果應用程序依賴于并行程序集,但不存在清單,則必須確保鏈接器為項目生成清單。 在項目的“項目屬性”對話框中選中鏈接器選項“生成清單”。
11.如果清單嵌入在二進制文件中,請確保 RT_MANIFEST 的 ID 對于此類型的二進制文件是正確的。 有關要使用的資源 ID 的詳細信息,請參閱使用并行程序集作為資源 (Windows)。 如果清單位于單獨文件中,請在 XML 編輯器或文本編輯器中打開它。 有關清單和部署規則的詳細信息,請參閱清單。
12.我們建議將清單嵌入在每個 DLL 中,因為在通過 調用加載 DLL 時會忽略外部清單。 有關詳細信息,請參閱程序集清單。
13.檢查清單中枚舉的所有程序集是否都正確安裝在計算機上。 每個程序集都通過其名稱、版本號和處理器體系結構在清單中進行指定。 如果應用程序依賴于并行程序集,請檢查這些程序集是否正確安裝在計算機上,以便操作系統加載程序可以找到它們(如程序集搜索順序中所述)。 請記住,64 位程序集不能在 32 位進程中加載,并且不能在 32 位操作系統上執行。
14.假設我們有一個使用 Visual C++ 生成的應用程序 appl.exe。 該應用程序清單作為二進制資源 RT_MANIFEST(ID 等于 1)嵌入在 appl.exe 中,或存儲為單獨文件 appl.exe.manifest。 此清單的內容類似于下面這樣:
15.對于操作系統加載程序,此清單指示 appl.exe 依賴于一個名為 Fabrikam.SxS.Library、版本是 2.0.20121.0 并且是為 32 位 x86 處理器體系結構而生成的程序集。 依賴的并行程序集可以作為共享程序集或私有程序集進行安裝。
16.共享程序集的程序集清單安裝在 %WINDIR%WinSxSManifests 文件夾中。 它標識程序集并列出其內容(即,作為程序集一部分的 DLL):
17.并行程序集還可以使用發行者配置文件(也稱為策略文件)對應用程序和程序集進行全局重定向,以使用并行程序集的某個版本而不是相同程序集的另一個版本。 可以在 %WINDIR%WinSxSPolicies 文件夾中檢查共享程序集的策略。 下面是一個示例策略文件:
18.此策略文件指定請求獲得此程序集的 2.0.10000.0 版本的任何應用程序或程序集都應改為使用 2.0.20121.0 版本(這是系統上安裝的當前版本)。 如果在策略文件中指定了應用程序清單中提到的程序集版本,則加載程序會在 %WINDIR%WinSxS 文件夾中查找清單中指定的此程序集的版本,如果未安裝此版本,則加載會失敗。 并且,如果未安裝程序集版本 2.0.20121.0,則對于請求獲得程序集版本 2.0.10000.0 的應用程序,加載會失敗。
19.不過,程序集也可以作為私有并行程序集安裝在已安裝應用程序文件夾中。 如果操作系統未能找到作為共享程序集的程序集,則它會按以下順序查找作為私有程序集的程序集:
20.在應用程序文件夾中檢查是否存在名為 .manifest 的清單文件。 在此示例中,加載程序嘗試在包含 appl.exe 的文件夾中查找 Fabrikam.SxS.Library.manifest。 如果找到清單,則加載程序從應用程序文件夾加載程序集。 如果找不到程序集,則加載會失敗。
21.嘗試在包含 appl.exe 的文件夾中打開 文件夾,如果 存在,則嘗試從此文件夾加載名為 .manifest 的清單文件。 如果找到清單,加載程序會從 文件夾加載程序集。 如果找不到程序集,則加載會失敗。
22.有關加載程序如何搜索依賴程序集的詳細信息,請參閱程序集搜索順序。 如果加載程序未能找到作為私有程序集的依賴程序集,則加載會失敗,并顯示消息“系統無法執行指定的程序”。 若要解決此錯誤,請確保依賴程序集(以及作為它們一部分的 DLL)作為私有或共享程序集安裝在計算機上。
23.獨立應用程序和并行程序集的概念
24.生成 C/C++ 獨立應用程序和并行程序集