在VS2008中,程序编译后会生成.manifest文件,并且如果没有此文件,程序就无法发布。这里就产生了疑问,为什么要此文件。
要弄明白这个文件,必须弄明白此文件是什么东西,这里我们可以从一个MFC工程中的Debug目录下,找开.manifest文件,如下:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level='asInvoker' uiAccess='false' /> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.VC90.DebugMFC' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' /> </dependentAssembly> </dependency> </assembly>
从上面我们可以看出一些规律:
1.它是一个xml文件,
2.它主要是一些依赖库文件的描述信息。比如节点dependency下。
那么在程序的运行过程中,它可能是为了引导执行文件来加载对应的库的,那么我们反思一下,为什么要这样一个文件来配置各种加载库呢,而不是一种写定在程序中的呢?
这里我想是为了使编译器各个部分能分开工作,其实在vs中,可以将此文件嵌入到执行文件中的。它是由Project > Tool Build Order > Manifest Tool确保打勾,这样manifest tool 会把.manifest嵌入到执行文件中,并且还会生成一个embed.manifest,它可以供比对,是否一致。
发布没有带manifest文件的话,会提示。
使用了版本不一致的库,msvcp90.dll,msvcr90.dll,msvcm90.dll
所以最好把manifest嵌入程序中。
转自:http://blog.sina.com.cn/s/blog_625cce080100osnn.html
转载于:https://blog.51cto.com/8796902/1425671