manifest原理和用途

dll是被动态调用的,所以会被若干个程序共享使用的 但是如果dll在应用程序不知道的情况下升级了、或是被另一个程序更改了,就可能会出现问题,即”DLL Hell”

随着系统资源越来越丰富,硬盘不那么紧张,所以在XP以后的操作系统中,用新的机制来管理DLL

(这种机制,这不仅仅是对于.NET而言,对于普通的Native程序也是一样的)

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>

不过使用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内的资源

对于我来说,使用SDL必须是启用DLL的动态链接方式,所以必须开启Manifest,并且让Manifest Embed进入exe比较方便

与上面内容相应的 是关于如何发布软件的问题,事实上只有VC6.0的CRT库是绑定作为Windows的一部分的,之后从VS.net开始,VC程序制作安装包也是要考虑 库文件的,只不过VC6.0时推荐拷入System32,VC.net时推荐放在exe文件local目录,而现在VS2005则还需要考虑 Manifest的问题了,看似麻烦,其实也还好,VS自带工具打包,下面一些网址也有讲如何手工做redistribution

VC manifest相关推荐

  1. 在Vista操作系统中通过manifest文件使VC应用程序获得管理员权限

    原文 VC编译出来的应用程序在vista下运行,有可能因为权限问题,不能成功运行. 用以下办法,给应用程序添加一个manifest文件,程序运行时系统就会跳出UAC对话框,获得管理权限. 1.打开应用 ...

  2. 程序终于实现跨机器运行——记VC++2005程序开发的一个常见问题

    最近经常被同学笑话说天天都在说我的程序可以跨平台,结果连跨机器都不行~~~这还得"归功"与VS2005的运行库和manifest作怪. 在VS2005里面编译的程序默认的配置是&q ...

  3. [转]VC无负担实现XP风格界面

    VC无负担实现XP风格界面 有件事情必须说一下,按照上面的方法,test.exe必须先调用InitCommonControls函数(已经废除,不建议使用)或者InitCommonControlsEx函 ...

  4. VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。

    C/C++ 预定义宏 例子:C/C++ 预定义宏的取值 C/C++ 预定义宏用途:诊断与调试输出 CRT 的诊断与调试输出:assert, _ASSERT/_ASSERTE, _RPTn/_RPTFn ...

  5. vc2005运行库彻底卸载_解决不安装VC运行库(VC2005,VC2008),程序运行出错的方法...

    因为VS2005以后程序采用了manifest的生成方式,所以发布的时候要和运行库一起发布.但是我们平时开发和发布的时候如果都要客户安装运行库,那就不太方便了.你可以Microsoft下载:http: ...

  6. VC++ 常用编程技巧总结

    VC++6.0的使用以及编程技巧整理 1.MDI子窗口一启动就最大化      BOOL   CChildFrame::PreCreateWindow(CREATESTRUCT&   cs) ...

  7. VC编写的程序不能在其他机器上运行的解决方案(续)

    我在前面的文章里面提到由于side-by-side问题导致的VC编写的程序不能正常启动的问题的解决方案,这种方法是针对于单个可执行文件的解决方案,但是有的时候你可能会碰到另外一种情况-也是由于side ...

  8. VC编写的程序不能在其他机器上运行的解决方案

    有的时候,你在Visual C++上面经过好几个月的辛勤努力,终于将程序编写完成并且测试完毕,然而当你试图在客户的发布机上运行刚写好的程序时,有可能会碰到类似下面的错误,操作系统告诉你"由于 ...

  9. Win7下运行VC程序UAC权限问题

    在Win7运行VC程序往往受到UAC权限不够的问题,以下有几个方法获得管理员权限 1.通过代码提升用户权限,代码如下: BOOL UpgradeProcessPrivilege(HANDLE hPro ...

最新文章

  1. YOLOv5的妙用:学习手语,帮助听力障碍群体
  2. 怎样在linux上部署web服务器
  3. directadmin php.ini 修改,如何快速修改DirectAdmin面板默认2222端口
  4. java mysql ssl警告_连接到MySQL数据库时有关SSL连接的警告
  5. 凭什么它能成为报表神器?这五大技术硬货不得不服
  6. [转载]Spring Boot Actuator 使用
  7. Android CI with jenkins in ubuntu
  8. Java后台入坑二:renrenfast后台打包和前端打包运行
  9. 根据3倍图生成2倍图和1倍图
  10. Truck History POJ - 1789 最小生成树Prim
  11. python安装包的时候报错 ERROR: Exception: Traceback (most recent call last): File “C:\Users\
  12. 原创 关于微信拼车小程序开发的需求分析(分析建模)
  13. 24L01配置函数详解
  14. 屏的像素与传输速率_HDMI传输速率是多少呢?
  15. 阶乘约数-蓝桥杯国赛java
  16. C语言编一个金山打字通小游戏,js实现金山打字通小游戏
  17. Springboot项目中报错Invalid bound statement(not found):com.******报错处理
  18. 世界上最常用的几种语言
  19. vscode 一个命令检查整体格式
  20. HDU2201 熊猫阿波的故事【水题】【概率】

热门文章

  1. hdu 6205 card card card 尺取+超神读入挂
  2. 朴素贝叶斯知识点概括
  3. iOS 开发经验总结
  4. 【12】AngularJS 事件
  5. 《OpenCV3编程入门》学习笔记7 图像变换(三 )重映射
  6. 算法设计与分析第5章 回溯法(一)【回溯法】
  7. HDU1089-1096 A+B for Input-Output Practice 系列问题(输入输出格式练习)
  8. 一般筛法求素数+快速线性筛法求素数
  9. mysql数据更新回退_Mysql的几个灵魂拷问(一)
  10. 职中计算机网络服务器管理必考题,2017年河北科技师范学院职教研究所、教育学院996计算机知识综合之计算机网络考研导师圈点必考题汇编...