在上一篇"部署VC2008应用程充 "中,我谈到过,如果安装了vcredist_x86.exe / vcredist_x64.exe 这两个发布包后,即使使用CRT/MFC和manifest的文件与应用程序放在同一目录下,也不会调用,会调用已安装的vcredist_x86.exe / vcredist_x64.exe 的CRT/MFC运行时库.
如果是调试版或安装的vcredist_x86/vcredist_x64已你机子上安装的VC2008不一致(例如是使用了SP1),应用程序仍然是不能正确运行的了.
解决的方法就是要求应用程序不再依赖vcredist_x86/vcredist_x64这两个包
解决方法如下:
1.删除生成的manifest,并修改生成manifest的方式
设置 Project->Properties->Configuration Properties->Manifest Tool->Input and Output->Embed Manifests: No
(中文版VC2008修改如下 项目->属性->配置属性->清单工具->输入和输出->嵌入清单:否)
2.重编译程序
3.将生成的程序和manifest拷贝到部署目录
4.打开manifest文件(appname.exe.manidfest),将所有的"MFC/CRT/ATL/OpenMP"的节点的"publicKeyToken"删除, 意,"Microsoft.Windows.Common-Controls"这个节点的"publicKeyToken"不要删除
5.将所"%ProgramFiles%/Microsoft Visual Studio 9.0/VC/redist/x86"所依赖的目录都拷贝到部署目录
6."Microsoft.VC90.CRT","Microsoft.VC90.MFC","Microsoft.VC90.ATL","Microsoft.VC90.OPENMP","Microsoft.VC90.MFCLOC"等这些目录拷贝到部署目录后(注,所依赖的,不必全部拷贝),将这些依赖的目录下的manifest文件中的"publicKeyToken",全部删除
7.修改manifest的版本号,要与所安装的VC2008版本一致("9.0.21022.8"为普通版本"9.0.30729.1"为SP1版本)
至此,我们的工作已经完成,程序可以任何安装了或不安装的vcredist_x86和vcredist_x64的机子上运行了!因为应用程序只依赖了编译机子上的CRT/MFC