我们的产品包括几个从开放源码构建到默认名称的文件中的DLL,由开放源码开发人员交付。我们非常小心地将文件安装到自己的目录中,并仔细地管理搜索路径(仅用于我们的进程),以使加载程序保持愉快。
另一个开发人员--一个高超的智力--认为在同一个默认DLL文件名下将自己的一些开源版本安装到C:\WINDOWS中会更容易。因此,当我们启动一个依赖于这些开源DLL的进程时,系统在我们的目录之前搜索C:\WINDOWS,并找到其他开发人员安装的DLL。当然,它们是不相容的。
到目前为止,我所想到的想法:
由于种种原因,目前这两种选择都不可取。
我们还能做些什么来保护自己不受世界上卓越的智慧的影响呢?
发布于 2010-03-12 08:19:42
为了增加已经很好的答案,您还有几个选择:
此问题的首选解决方案(自Windows支持)是将dll转换为win32程序集(它们不一定是.NET,但有关创建具有强名称的win32程序集的文档非常轻,因此很容易混淆并认为这是一种仅使用.NET的技术)。
程序集比包含dll和包含assemblyIdentiy元素的assemblyIdentiy和程序集中每个dll的文件节点数的文件夹(具有程序集的名称)要复杂得多。
基于程序集的搜索工作,即使当dll是静态链接!
如果exe位于不同的文件夹中,则有两种访问共享程序集的方法:
如果不能,或者不想将dll捆绑成程序集,那么此页涵盖dll搜索顺序。
使用像SetDllDirectory这样的函数只会帮助在运行时动态加载dll(通过LoadLibrary)。
Dll搜索顺序过去是:
您可能已经习惯了这一点-启动每个exe,将“当前”目录设置为包含OSS dll的文件夹。
随着SafeDllSearchMode的出现,现在的搜索顺序是:
这意味着现在的控制比以往任何时候都少:( -它对“不受信任”c:\windows & System32文件夹的控制速度更快。
同样,如果初始dll是通过LoadLibrary加载的,并且它的依赖dll是问题所在,则带有LOAD_WITH_ALTERED_SEARCH_PATH标志的LoadLibraryEx将导致以下搜索顺序(假设您传递到LoadLibraryEx的完整路径):
发布于 2010-03-11 21:58:05
您只有两个选项:将DLL部署在与EXE相同的目录中(这是Windows首先查找的位置),或者使用清单并将DLL部署到Windows并行缓存中。我不认为后一种选择在开放源码世界中很常见,但是如果您想要在不同的应用程序之间共享DLL,这是唯一真正的解决方法。
发布于 2010-03-11 22:14:19
加载应用程序的目录通常是加载DLL时搜索的第一个目录。但是,您可以使用SetDllDirectory获取“备用搜索顺序”。在本例中,首先搜索指定给SetDllDirectory的目录。
也有一个SafeDllSearchMode在一定程度上影响了这一点。打开它将当前目录排除在搜索之外。
https://stackoverflow.com/questions/2428963
复制相似问题