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