VS2008遇到的error R6034,程序清单问题

23 篇文章 0 订阅

今天在更新了代码之后,编译完成调试运行时突然弹出了一个debug error,R6034,


代码是没有问题,但是由于之前请假离职了一个半月,所以这次回来从SVN上更新代码后就出现了这个问题,在跟同时认真确认代码没错并在他们的电脑上正常运行后,我试着研究了一下,确实学到了一点东西。

首先,从字面看,他提示程序要启动一个程序清单上没有的运行库?那么首先就要搞清楚程序清单是什么东西。


在网上搜了一下,资料并不是很多,比较全的是这位大佬的:

https://blog.csdn.net/suxinpingtao51/article/details/42870937

(偷个懒转过来hhhhh)

Manifest
Windows XP通过XML文件来实现这一功能,这些XML文件保存了有关应用程序配置的元数据,这里所说的XML文件,就是Manifest清单文件。
Manifest事实上就是一个以.manifest为后缀的XML文件,用于组织和描述隔离应用程序及并行组件,其内部的信息如<assemblyIdentity>元素则标识着一个唯一的程序集,和其他信息一起,他们用于COM类、接口及库的绑定和激活,而这些信息,以往都是存储在注册表中的。另外,Manifests也制定了组成程序集的文件及Windows类。

二、Manifest的分类
在Windows XP中,事实上是在.NET中,把Manifests分类为如下几种类型:
1、程序集Manifests(Assembly Manifests):主要用于描述程序集,管理程序集的名字、版本、资源、依赖程序集。其中共享程序集的Manifests存储在Windows的WinSxS目录中。私有的程序集Manifests则存可以作为一个资源存储在DLL中,也可以存储在应用程序目录下。
2、应用程序Manifests(Application Manifests):这类Manifests则用于描述隔离应用程序,它管理着此应用程序在运行时要绑定的共享的并行组件的名字、版本。该Manifests可以作为一个文件(.manifest文件)存储在应用程序相同的目录下,也可以作为一种资源嵌入在可执行文件内部(Embed Manifest)。
3、应用程序配置文件(Application Configuration Files):对于并行组件及隔离应用程序来说,使用这种Manifests来“Override and Redirect”所依赖程序集的版本。
4、发行配置文件(Publisher Configuration Files):用于重定向并行组件的版本到另外一个合适的版本的Manifests。此时,被重定向的新程序集应该和原来的旧程序集具有相同的主.次(majou.minor)版本号。

三、Windows对于Manifest的处理
XP以前版本的windows,会像以前那样执行这个exe文件,寻找相应的dll,没有分别,Manifest只是个多余的文件或资源,dll文件会直接到system32的目录下查找,并且调用。
而XP及其以后的操作系统,则会首先读取Manifest,获得exe文件需要调用的DLL列表(此时获得的,并不直接是DLL文件的本身的位置,而是DLL的manifest)操作系统再根据DLL的Manifest提供的信息去寻找对应的DLL ,这样就可能区别不同版本的同一个DLL文件。这就说明了为什么我的程序可以在2000下面运行,而在XP及2003上无法运行。
这也使得很多木马可以利用这个特点实现限制安全软件。
所以在发布包的时候除了提供VC运行环境,也把manifest文件提供。
总的来说呢,在VS中,同一个DLL可能被多个程序所使用,但有时版本不同,程序一旦加载错了就会出问题,所以微软就设立了这个程序清单文件来确保程序正确加载对应的DLL。

最后回到开始遇到的问题,R6034错误。

我的解决办法是

修改项目属性:

项目属性→链接器→清单文件→生成清单→是

项目属性→清单工具→输入和输出→嵌入清单→是。

之后重新编译生成,无问题正常运行。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值