我自己的(本机)DLL 的清单

Posted

技术标签:

【中文标题】我自己的(本机)DLL 的清单【英文标题】:Manifest for my own (native) DLL 【发布时间】:2012-10-12 06:32:51 【问题描述】:

注意:这个问题不是关于 MFC/CRT DLL 链接有/没有 .manifest 文件、避免清单查找(即从当前路径强制加载)、VC redist 安装和类似的问题。

我有一组 DLL,供不同的应用程序使用。这些应用程序和 DLL 有一些产品版本(如 7.0、8.0 等)。总而言之,让我使用一个 DLL 和两个应用程序。

App.exe 取决于 Core.DLL GoodApp.exe 也依赖于 Core.DLL

7.0 版的App.EXE 需要7.0 版的Core.DLL。同样,版本 X 的 GoodApp 需要版本 X 的 DLL。

由于 DLL 是由不同的应用程序共享的,所以我将 DLL 放到了一些公共路径中。这样可以避免将 DLL 粘贴到所有路径上。为此设置了一些\SharedDLL 路径。并且(假设),我为此设置了PATH 变量。 因此,当任何应用程序加载时,操作系统将简单地从该公共路径加载 Core.DLL。

一切都好。但是如果 App.exe 是 64 位/Debug,或者其他配置呢?公共 DLL 路径不能包含所有 DLL(32/64、调试/发布)。在类似的行中,版本 Y 的 App.exe 不能使用版本 X 的 Core.DLL不是 X>Y 或 Y>X,而只是 X!= Y,X版本的App不能使用Y版本的DLL)。

简而言之,App-32bit-Release-VersionX 只需要 DLL-32bit-Release-VersionX,仅此而已!由于 DLL 名称相同,我无法将它们放入一个公共路径中。而且,由于有几十个应用程序(还有 DLLs!)依赖于Core.DLL,我只是不想浪费空间和时间将 DLL 复制到 EXE 的路径中。

是的,我使用 post-build-setup 将 DLL 适当地复制到所有路径中。这解决了时间,但浪费了空间。如果有新的应用程序进来,也必须修改 PBS 以复制到那个新路径。

问题是:如何利用 Windows/MFC/CRT DLL 使用的 .manifest 功能?他们确实使用WinSxS 文件夹来处理此类事情。

【问题讨论】:

后退一分钟,看看你问了什么。您正在寻求一种共享 DLL 的方法。这已经很简单了,通过将其复制到与 EXE 相同的目录中,为每个 EXE 提供其自己的 DLL 副本。并行缓存解决了 Microsoft 特有的问题。 是的,所以 DLL 非常特定于 Microsoft!我已阅读有关共享/私有程序集以及如何为“自定义”(非 MS)DLL 构建 XML 的信息。没有足够的时间对其进行全面测试!而且我想避免复制 DLL 的“简单”事情! 不,特定于 Microsoft 的 DLL。他们错误地将 DLL 放在 PATH 上的目录中。永远不要犯同样的错误。 【参考方案1】:

也许这会对你有所帮助:

How to: Embed a Manifest Inside a C/C++ Application,

Manifest Generation in Visual Studio

Working with Visual Studios C++ manifest files

也可以点击这些页面中的链接

【讨论】:

以上是关于我自己的(本机)DLL 的清单的主要内容,如果未能解决你的问题,请参考以下文章

JNA:本机库依赖项和JAR提取

为啥我的 DLL 被 MSE 检测为可疑?

不注册如何使用vlc.dll?

阅读我自己的罐子清单采取 2

缺少 DLL 清单

读取 EXE 或 DLL 的清单而不加载它