注意:这个问题不是关于 MFC/CRT DLL 链接有/没有.manifest
文件、避免清单查找(即从当前路径强制加载)、VC redist 安装和类似问题。
我有一组 DLL,供不同的应用程序使用。这些应用程序和 DLL 有一些产品版本(如 7.0、8.0 等)。总而言之,让我使用一个 DLL 和两个应用程序。
App.exe
取决于Core.DLL
GoodApp.exe
也取决于Core.DLL
App.EXE
7.0 版需要Core.DLL
7.0 版。同样,GoodApp
版本 X 将需要版本 X 的 DLL。
由于 DLL 将由不同的应用程序共享,因此我将 DLL 放入了一些公共路径。这样可以避免将 DLL 粘贴到所有路径上。\SharedDLL
为此设置了一些路径。并且(假设),我已经为此设置了PATH
变量。因此,当任何应用程序加载时,操作系统将简单地从该公共路径加载 Core.DLL。
一切都好。但是如果 App.exe 是 64 位/Debug,或者其他配置呢?公共 DLL 路径不能包含所有 DLL(32/64、调试/发布)。在类似的行中,App.exe
Y 版本的不能使用Core.DLL
X 版本(不是X>Y 或 Y>X,而只是X!=Y,X 版本的 App 不能使用 Y 版本的 DLL)。
简而言之,App-32bit-Release-VersionX完全需要DLL-32bit-Release-VersionX,仅此而已!由于 DLL 名称相同,我无法将它们放入一个公共路径中。而且,由于有几十个应用程序(还有 DLL!)依赖于Core.DLL
,我只是不想浪费空间和时间将 DLL 复制到 EXE 的路径中。
是的,我使用 post-build-setup 将 DLL 适当地复制到所有路径中。这解决了时间,但浪费了空间。如果有新的应用程序进来,也必须修改 PBS 以复制到该新路径。
问题是:如何利用 Windows/MFC/CRT DLL 使用的 .manifest 功能?他们确实利用WinSxS
文件夹来做这样的事情。