什么是vs 程序的manifest文件

manifest 是VS程序用来标明所依赖的side-by-side组建,如ATL, CRT等的清单。

为什么要有manifest文件

一台pc上,用一组建往往会有不止一个版本(c:/windows/winsxs或系统目录下),程序在加载的时候,不知加载哪个,于是manifest文件来指明。

manifest在哪儿,如何创建。

如果用VS开发,可以Set通过porperty->configuration properties->linker->manifest file->Generate manifest To Yes来自动创建manifest来指定系统的和CRT的assembly版本。

除了这样产生外部的manifest file,还有embedded manifest信息可以被写到所生成的二进制文件内

Set porperty->configuration properties->manifest tool->embed manifest  To Yes

对于xp及早前的windows版本,external manifest会比embed manifest有更高的优先级,但对于windows server及后的版本,相反。

为什么我的manifest明明指明

name="Microsoft.VC80.DebugCRT" version="8.0.50608.0",

但是用depends.exe工具却发现引用的是8.00.50727.42呢?

因为在C:/WINDOWS/WinSxS/Policies下,有publisher configuration file也叫policy文件,如8.0.50727.42.policy文件对依赖做了重定向:

<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" processorArchitecture="ia64" publicKeyToken="1fc8b3b9a1e18e3b"/>
<bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/>
</dependentAssembly>

指明"8.0.41204.256-8.0.50608.0"都被定向到8.0.50727.42。这是assembly提供商如MS对低级版本bug的修正而提供的解决方法。除此之外,你也可以用application config文件来对本程序做assembly的重定向。如在你bin local文件夹下 yourbin.extention.config:

<configuration>
       <windows>
           <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
        <assemblyIdentity type="win32" name="Microsoft.VC80.ATL" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        <bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/>
          </dependentAssembly>
          <dependentAssembly>
        <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/></assemblyIdentity>
        <bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/>
          </dependentAssembly>
       </assemblyBinding>
       </windows>
</configuration>

如何决定我程序manifest信息所指定的assembly版本信息?

在assembly头文件中,assembly的版本信息被指明了。如crtassem.h中

#ifndef _CRT_ASSEMBLY_VERSION
#define _CRT_ASSEMBLY_VERSION "8.0.50608.0"
#endif

可以修改8.0.50608.0为8.0.50727.42以产生你想要的manifest信息。

若我想将我的程序发布为独立程序集(isolated application),不去依赖目标pc的系统assembly,该怎么办?

带上所有依赖的assembly和相应的manifest文件(c:/windows/winsxs),注意,manifest信息要直接可以指定到所附带的assembly DLLs,不需要依赖policy的重定向。

最新文章

  1. JSONKit在项目中使用设置(ARC与方法更新)
  2. Appcan——Box
  3. Vue学习笔记(一)
  4. Android开发学习——应用安装过程
  5. 数据绑定控件之Repeater
  6. 进击的docker 二 : docker 快速入门
  7. c#静态构造函数
  8. IOS第15天(2,事件处理,侧滑菜单,抽屉效果)
  9. sd 卡驱动--基于高通平台
  10. python 学习笔记-----编码问题
  11. Mysql导入数据库的方法
  12. codeforces A. Group of Students 解题报告
  13. DBA常用SQL之表空间与数据文件
  14. 数组的map方法
  15. poj2337欧拉回路要求输出路径
  16. mysql-8.0 安装教程(自定义配置文件,密码方式已修改)
  17. codeforces-1131 (div2)
  18. Mac 下生成keystore,并对apk进行签名
  19. Windows10上强制Visual Studio以管理员身份运行
  20. [Spring]初识Spring-Spring的基础使用-如何通过Bean来实例化?

热门文章

  1. PYTHON:HTTP头设置工具(以附件名为例)
  2. mysql补集合计算
  3. TFS2012常见问题及解答
  4. CSS常见的浏览器前缀
  5. (转)持续化集成工具CruiseControl.NET
  6. 让 Putty 保存密码,自动登陆的四种方法
  7. vim全局替换
  8. Error LNK2001 无法解析的外部符号 的几种情况及解决办法
  9. linux FTP 批量下载文件
  10. JAVA MemCache 史无前例的详细讲解【转】