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