现在的位置: 首页 > 综合 > 正文

VC manifest

2013年10月13日 ⁄ 综合 ⁄ 共 1615字 ⁄ 字号 评论关闭

从 VS2005 开始,微软在 VC 的编译选项中添加了manifest (中文) 这个功能,这将有助于软件以
Side-by-side 方式运行。

采用 /MD 和 /MDd 运行时库选项的项目 manifest 是必要的。当程序启动时发生类似下图找不到 MSVCRxxx.dll 时可能就是程序没有正确地嵌入、或配置(非嵌入时)清单文件。

怎样给程序嵌入manifest清单?

打开默认的 manifes t链接功能需要修改两处配置:

1). 项目属性 -> 配置属性 -> 链接器 -> 清单文件 -> 生成清单,设置为“是”;

2). 项目属性 -> 配置属性 -> 清单工具 -> 输入和输出 -> 嵌入清单,设置为“是”。

生成解决方案即可。

若要关闭清单嵌入功能则可将上述选项改为“否”。

找不到 MSVCRxxx .dll ?

确认安装了相应版本的 VC 运行时库。采用 /MD 和 /MDd 编译的 VC 程序运行时需要有 VC 运行时库可再发行组件包的支持(下载 VC 可再发行组件包)。你也可以将对应的运行时库 dll 和应用程序一起打包发布,当然这无疑会增大厂商的发布负担和客户的存贮负担。

确认应用程序正确地嵌入或配置了 manifest 清单文件。

关键的 Error 14001 ?

用 VS 自带的错误查找工具得到的解释为:“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”。该错误在
P/Invoke 下表现为 Exception from HRESULT: 0x800736B1

通常该错误意味着应用程序的依赖 dll 库找不到或者依赖库的依赖库找不到。用
Dependency Walker
 可以方便的查看应用程序依赖的 dll 是否存在。补上找不到的dll一般就没啥问题了。一些公用的dll可以从
DLL-files.com
 获取。

如果发现 Dependency Walker 的日志窗口出现类似下面的报错,需特别注意:

Error: The Side-by-Side configuration information for "YOUR.DLL" contains errors.This application has failed to start because the application configuration is incorrect.Reinstalling the application may fix this problem (14001).

此时应该确认所以被依赖的 dll(包括被间接依赖的 dll)中内嵌的 manifest 所依赖的运行时库都是可用的。如果这些 dll 所依赖的运行时库是不同的,则应该安装这些依赖的运行时库或将对应的 dll 拷贝到应用程序所在目录。

可以在 VS 直接打开 exe 或者 dll 文件来导出查看 manifest 的内容。(原文的下图不知怎么打开的

一些担当库角色的 dll 可能是由第三方在很早以前就生成好的,应用程序发布时相应的运行时库可能已经很难获得,要针对每个 dll 都找到其对应的运行时库版本就更难了。将所有这些不同版本的运行时库都搜集齐并安装给最终用户也实在是一种羞辱,微软早已保证了新版本的运行时库向前兼容。

那,怎么做?怎么做才能让这些早期发布的 dll 自动绑定到新版本的运行时库?

将 manifest 过早的嵌入到 dll 中本身就是一种错误,这种硬绑定直接限制了 dll 自动升级到新的运行时库,并会导致其他一系列问题。比如,程序将无法从一个模块中申请内存然后在另外一个模块中释放,即使采用的是 /MD 选项,也因不同版本的运行时库内存管理不在一个堆上,棘手的跨模块的内存管理问题扑面而来。倒!

最好的做法是:仅在一个地方(可执行文件)嵌入 manifest 来指明运行时库,不要在任何 dll 中采用 manifest。

当然也可以选择非嵌入的 manifest,这样后期升级只要手动更改 xml 文件即可。

参考:

0. 原文
1. How to: Deploy using XCopy
2. Redistributing Visual C++ Files

抱歉!评论已关闭.