在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文件的话,会提示。

wKiom1OaZ47wrwVSAADsl4vK8DA172.jpg


使用了版本不一致的库,msvcp90.dll,msvcr90.dll,msvcm90.dll

wKioL1OaZ2HwBdxgAADoN7qITko368.jpg

所以最好把manifest嵌入程序中。


转自:http://blog.sina.com.cn/s/blog_625cce080100osnn.html