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