问题如下:
vs2005编译出来的程序,发布时强制让用户安装了C++ Run Time 2005 Restribution,但在个别用户处运行时都出现如下错误:
Error Signature:AppVer 2.0.1.11 ModName: msvcr80.dll ModVer 8.0.50727.1433 Offset 0004f029
我在google上搜了一下,发现很多软件譬如OutLook, Avg等等
http://freeforum.avg.com/read.php?14,137193,page=1,backpage=4,sv=
http://www.eggheadcafe.com/conversation.aspx?messageid=31717861&threadid=31717861
都有这种类似的运行问题,主要应该是mfc动态库造成的。
现在我想要在我的机子上重复这个bug,便于我调试。我试过自己装一个.net framework 2.0 SP1,但还是没法重复。
一种方法是在.exe旁边加manifest指定msvcr80.dll(version 762)的库,我试下来发现这种方法只对机子里没有更新的msvcr80.dll成立,当有更新的msvcr80.dll时,程序不会用同一目录里的 msvcr80.dll.下面两种试验方法都可证明:
1. 在程序中用GetModuleFileName取一下dll的完整路径,发现为1433版本库路径。
2. 把1433的msvcr80.dll改名,程序无法运行。
解决方法:
http://davidlenihan.com/2007/07/winsxs.html
http://eparg.spaces.live.com/blog/cns!59BFC22C0E7E1A76!3944.entry
http://blog.kalmbachnet.de/?postid=80
总结一下:
(1):在自带的manifest(集成或者不集成都可以)去掉publicKeyToken这项,然后把相应的.dll放在.exe(dll)目录。
(2): 让用户修改policy文件,去掉依存关系。
(3): 可能装一个vs2008的CRT Restirbution就可以了。