我自己的(本机)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 的清单的主要内容,如果未能解决你的问题,请参考以下文章