问题描述:
当电脑同时安装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.0VC edistx86 )
所以程序运行时其实际依赖的是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.0VC edistx86 目录下的Microsoft.VC90.MFC和Microsoft.VC90.CRT文件夹(具体看是否被程序引用)拷到应用程序目录。再将manifest文件中的版本号修改为9.0.21022.8。