VS 2005 Release 中编译 manifest 不正常的问题
Madifest是个XML的描述文件,对于每个DLL有DLL的Manifest文件,对于每个应用程序Application也有自己的Manifest
对于应用程序而言,Manifest可以是一个和exe文件同一目录下的.manifest文件,也可以是作为一个资源嵌入在exe文件内部的(Embed Manifest)
XP以前版本的windows,会像以前那样执行这个exe文件,寻找相应的dll,没有分别
Manifest只是个多余的文件或资源,dll文件会直接到system32的目录下查找,并且调用
而XP以后的操作系统,则会首先读取Manifest,获得exe文件需要调用的DLL列表
(此时获得的,并不直接是DLL文件的本身的位置,而是DLL的manifest)
操作系统再根据DLL的Manifest去寻找对应的DLL
<因此就可能区别不同版本的同一个DLL文件,或是指定一个程序本身Isolated的DLL>
VS 2005中,如果一个项目默认情况下不修改Release的选项,那么Manifest是编译不正确的,典型的情况就是如果使用了UxTheme(视觉主题)那么会导致Debug下可以正常运行,在Release时却不能正常运行!因为Debug状态下,调用的是新版本的comctl32.dll,而Release下调用了老的%system%目录下的comctl32.dll,这两个版本是有区别的!这样某些API无法正常工作导致程序错误。
使用Visual Studio 2005以后的一个新问题是,VS2005带的8.0新版的C运行库(VC 8.0 CRT)文件在XP以后支持manifest的Windows版本中被调用时,将会check一下Application自身的Manifest,否则将会拒绝被调用,这也就是说,使用Visual Studio开发的Application,Manifest将是必不可少的(搞不懂MS为啥要这样设置,所以与VS2003.NET不同了)(后来想想,除了MS自己说的哪些冠冕堂皇的原因,至少这样一来Linux的Wine模拟要麻烦多了)
除非,你的程序是静态链接的,没有使用dll,只使用了操作系统核心的 Kernel32.dll, User32.dll, Ole32.dll, 或ShDocVW.dll 等
project的设置必须是Use Standard Windows Libraries、Not Using ATL、No Common Language Runtime support
那么你可以不需要考虑Manifest 可以关掉它
VS2005中Menifest相关的设置:
Project/Properties/Linker/Manifest File/Generate Manifest 决定是否生成Manifest,如上情况才可以关闭
Project/Properties/Linker/Manifest File/Allow Isolation 这个是设置DLL的调用的,并不能决定Manifest是否还是必须的
Project/Properties/Manifest Tool/Input and Output/Embed Manifest 决定Manifest是个单独的文件还是嵌入到exe内的资源