害人的VS2008,manifest導致“應用程序配置不正確,應用程序未能啟動”
開發環境:VS2008 SP1 + Win2003 SP2
因為我的VS2008安裝了SP1補丁,所以有了9.0.30729.1的MFC庫文件(MFC90.DLL MSVCR90.DLL)。
新建了一個MFC應用程序,編譯為RELEASE版本,叫做“test1.exe”,可以從程序中的清單文件(manifest)看到以下內容:
- XML code
... <dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'/>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.MFC' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'/>
</dependentAssembly>
</dependency> ...
說明本程序需要引用版本號為9.0.21022.8的MFC庫和運行時庫。
問題一:為什么程序在運行的時候,載入的不是9.0.21022.8版本的卻是9.0.30729.1版本的運行庫?這是在哪里進行設置的?如何改變這個版本號?
問題二:(雖然貌似已經解決,但是我想知道的更深一點)
布署的時候,把X:\VS安裝目錄\VC\redist下對應的運行庫和.manifest文件(都是9.0.30729.1版本的)復制到與test1.exe同一目錄下。在一臺完全干凈的新系統中,會出現“應用程序配置不正確,應用程序未能啟動”的錯誤。
后來,經過不斷的試驗,發現應用程序中的MANIFEST文件指定的是9.0.21022.8版本的運行庫,然后我使用9.0.21022.8版本的Microsoft.VC90.CRT.manifest文件替換9.0.30729.1版本的Microsoft.VC90.CRT.manifest,配合上30729版本的MFC90.DLL,程序就可以正常運行了。
簡單一點,就是,對于一個使用了新版本DLL功能的應用程序,有以下情況:
應用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 卻指定了舊的版本號] + 新版本的運行庫MANIFEST文件 + 新版本的運行庫DLL --> 不可以運行
應用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 卻指定了舊的版本號] + 舊版本的運行庫MANIFEST文件 + 舊版本的運行庫DLL --> 不可以運行
應用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 卻指定了舊的版本號] + 舊版本的運行庫MANIFEST文件 + 新版本的運行庫DLL --> 可以運行
注:運行庫MANIFEST文件是指Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest,運行庫DLL是指MSVCR90.DLL MFC90.DLL
程序的清單文件不要內嵌,而使用外置的MANIFEST文件,然后手工把生成的text1.exe.manifest中的version='9.0.21022.8'改成新版本號version='9.0.30729.1' ,就可以達到以下目標了:
應用程序 外置的MANIFEST文件[使用了使用了新版本DLL的功能 卻指定了新的版本號] + 新版本的運行庫MANIFEST文件 + 新版本的運行庫DLL --> 可以運行!
(內嵌清單也是資源,當然可以修改,但是不建議這么做,而且也沒必要這么做。)
終于終于,在微軟網站找到了關于這個問題的描述。
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=361682
這的確是個BUG,具體什么時候會修復就不知道了。。。。。。。。
所以,內嵌清單中的版本號只能為舊版本號,因此目前只能用,舊版本的運行庫MANIFEST文件 + 新版本的運行庫DLL ,才可以運行獨立發布的程序了。。。
在VS2008中,“項目”-->“屬性”-->“配置屬性”-->“清單工具”-->“輸入和輸出”-->“嵌入清單”-->否。
這樣程序編譯后,假設是mytest.exe,將會產生一個mytest.exe.manifest,發布軟件時最好附帶上這個manifest文件,用記事本打開,可以看到對應MFC/CRT.manifest的版本。
在VS2008中,“項目”-->“屬性”-->“配置屬性”-->“清單工具”-->“輸入和輸出”-->“嵌入清單”-->是。mytest.exe將包含mytest.exe.manifest,不額外產生mytest.exe.manifest。
“配置屬性”其它設置:(1)常規-->MFC的使用:在共享DLL中使用MFC;(2)C/C++ -->檢查64位可一致性問題:否;(3)C/C++ -->代碼生成-->運行時庫:多線程調試DLL(/MDd);(4)鏈接器-->清單文件-->生成清單:是
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成