【发布时间】:2011-01-21 02:02:15
【问题描述】:
我正在开发一个使用多个 DLL 的 Windows 应用程序 (EXE)。在 VCExpress 2005 (VC 8.0) 中开发,仅使用 C。
其中一些 DLL 是插件/附加组件/扩展,它们根据 EXE 读取的配置文件使用 LoadLibrary 动态加载。
重要的是:应用程序必须是可移植的(即无需安装即可从 USB 闪存驱动器或类似设备运行),并且插件 DLL 可能与应用程序 EXE 不在同一文件夹中(遗留原因) .
使用 MSVC6,这很简单:编译、链接、分发 EXE 和 DLL。
使用 MSVC8,C 运行时库 (MSVCRT) 不再随操作系统一起分发,因此人们不能依赖它的安装。为了满足可移植性要求,我需要使用private assembly。所有的 EXE 和 DLL 都嵌入了它们的清单。
我的问题:通过LoadLibrary() 加载的插件DLL 找不到EXE 文件夹中的私有程序集,因此除非安装了Microsoft.VC80.CRT 程序集,否则尝试加载它们会失败在 winSxS 中。
问题:如果从插件 DLL 中删除清单,一切正常。
我的问题:
在问题的情况下,Windows 似乎没有遵循Assembly searching sequence 或Dynamic link library search order。具体来说,它在加载 DLL 的路径中查找私有程序集,而不是从加载应用程序 (EXE) 的路径中。
我试图通过将程序集与 DLL 相邻并更改当前目录(以排除与工作目录相关的情况)来验证这一点,并获得预期的行为。其他人可以确认这是将LoadLibrary与 SxS 一起使用时的正常行为吗?我是否正确假设没有清单,DLL 会退回到非 SxS 加载顺序,即在 EXE 的文件夹中找到
msvcr80.dll(而不是程序集清单Microsoft.VC80.CRT.manifest)?如果我对 (1) 和 (2) 的看法是正确的,那么仅从 DLL 中排除清单会失去什么?换种说法,为什么我不应该通过排除清单来解决我的问题?
【问题讨论】:
标签: dll manifest msvcrt loadlibrary