好的,分析到此告一段落~那么这个问题该怎么解决呢?当然,我们可以使用资源修改工具,例如ResHacker来将编译出来的DLL中的Manifest信息进行修改,改成合适的版本,使得这个版本号与发布产品时使用的VC2005的版本一致。这个办法是肯定可行的,但是每次递交的时候,都要去修改,那岂不是很麻烦?有没有其它简单的办法呢?
在这个男人的VC2005中搜索8.0.50727.4053的字符串,会发现在以下三个文件有这个字符串:
Find all "8.0.50727.4053", Match case, Subfolders, Find Results 2, "Visual C++ Include Directories"
Cannot access E:\Tools\Microsoft Visual Studio 8\VC\PlatformSDK\common\include
E:\Tools\Microsoft Visual Studio 8\VC\include\crtassem.h(23):#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053"
E:\Tools\Microsoft Visual Studio 8\VC\atlmfc\include\atlassem.h(22):#define _ATL_ASSEMBLY_VERSION "8.0.50727.4053"
E:\Tools\Microsoft Visual Studio 8\VC\atlmfc\include\MFCassem.h(22):#define _MFC_ASSEMBLY_VERSION "8.0.50727.4053"
Matching lines: 3 Matching files: 3 Total files searched: 3423
可以看到这三个文件分别对应了微软的CRT库/ATL库/MFC库。
打开其中一个文件E:\Tools\Microsoft Visual Studio 8\VC\include\crtassem.h
////////////////////////////////////////////////////////////////////////////////////////////
#pragma once
#ifndef _VC_ASSEMBLY_PUBLICKEYTOKEN
#define _VC_ASSEMBLY_PUBLICKEYTOKEN "1fc8b3b9a1e18e3b"
#endif
#ifndef _CRT_ASSEMBLY_VERSION
#if defined _USE_RTM_VERSION
#define _CRT_ASSEMBLY_VERSION "8.0.50608.0"
#else
#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053"
#endif
#endif
#ifndef __LIBRARIES_ASSEMBLY_NAME_PREFIX
#define __LIBRARIES_ASSEMBLY_NAME_PREFIX "Microsoft.VC80"
#endif
/////////////////////////////////////////////////////////////////////////////////
尝试一下将#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053"改为#define _CRT_ASSEMBLY_VERSION "8.0.50727.762",是不是就可以了呢?但是事实却无情地摧毁了这个男人的信心。因为实际编译出来的DLL中除了8.0.50727.4053这个Manifest信息之外,又多了一个新8.0.5.727.762的节点,但是似乎这样并不能让Windows去按照Manifest策略加载DLL(不是按照“或”的逻辑加载,而是按照“与”的逻辑),只能将4053这个节点删除,只保留762这个节点,才能正确加载DLL。
后来再狗狗的时候,发现了国外的一篇讨论帖,貌似对这个问题有很好的解释(http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-vc/11078/),其中有一个回复:
the problem was the latest security update for Visual C++ 2005 SP1.
It forces your app to use a newer version of CRT and MFC (8.0.50727.4053
instead of 8.0.50727.762)
To fix this, (my recommended approach) go to add/remove programs (with show
updates checked) and uninstalll KB971090, or (will work, but is a pain) send
them the newest vcredist_x86.exe from the bootstrapper folder on your hard
drive.
基本也说明了本篇文章的目的。但是在这个男人的系统上,并没有这个补丁啊?只有一个KB973923,不知道会不会是因为这个原因:
备注:
1.VC2005SP1的官网:
http://support.microsoft.com/kb/973923/zh-cn
2.VC2005的下的分发包路径:
X:\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86