問題描述:
當電腦同時安裝VS2008和VS2008 SP1時,編譯出來的Visual C++程序的manifest 文件會默認引用VS2008的MFC版本和CRT版本。如下:
<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庫和運行時庫。
但是程序可能編譯時引用的卻是VS2008 SP1的MFC庫和運行時庫,其版本號為:9.0.30729.6161.
(具體以電腦上的安裝版本為准,Release版路徑在:C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86 )
所以程序運行時其實際依賴的是9.0.30729.6161 MFC庫,但是卻查找的是9.0.21022.8版本的MFC庫. 如果程序用到了9.0.21022.8版本的MFC庫里沒有的功能。 就會報錯。
解決方法:
因為vc++應用程序運行時搜索庫文件默認會先搜索C盤下庫文件,再搜索本地文件夾下的MFC庫。 所以需要如下解決方式:
方法1:給項目開始的頭文件里加上宏,使之只能使用9.0.30729.6161的MFC庫。 (鑒於微軟后續的更新可能會引起BUG, 不推薦此方法)
方法2: 在應用程序的本地運行目錄拷貝9.0.30729.6161版本的MFC庫,但是將其manifest 版本改為9.0.21022.8;即:把C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86 目錄下的Microsoft.VC90.MFC和Microsoft.VC90.CRT文件夾(具體看是否被程序引用)拷到應用程序目錄。再將manifest文件中的版本號修改為9.0.21022.8。
