当加载DLL(动态地使用LoadLibrary
/ Ex
或静态)是否有可能阻止Windows使用PATH环境变量来查找DLL / DLL的其他DLL加载取决于?
我能为Dynamic-Link Library Search Order找到的文档似乎暗示没有办法阻止搜索PATH,但也许我错过了什么?
我之所以这样问的原因是,我们希望有一个快速失败的方案,当应用程序文件夹中缺少(静态)链接的DLL但可能存在于PATH上时(不同版本)。
答案 0 :(得分:5)
对于动态加载的dll:控制加载哪个dll的最简单方法是不调用搜索逻辑。只有在提供部分路径时才会调用搜索逻辑 - 在调用LoadLibrary时提供dll的完全限定路径,如果该位置中不存在Dll,则调用将失败。
对于静态加载的dll:仅在WinSxS和应用程序的文件夹中搜索属于程序集一部分的Dll。因此,创建一个“虚拟”程序集来保存dll。这就像使用以下内容创建.manifest文件一样简单:
<!-- dummyassembly.manifest -->
<assembly manifestVersion="1.0">
<assemblyIdentity type="Win32" name="dummyassembly" version="1.0.0.0" processorArchitecture="x86"/>
<file name="thedll.dll"/>
</assembly>
将此代码添加到任何只需要使用精确dll的项目中:
#pragma comment(linker, "/manifestdependency:\"dummyassembly'"\
" processorArchitecture='*' version='1.0.0.0' type='win32'\"")
如果同一文件夹中不存在dll,则无法加载。
答案 1 :(得分:2)
您可以在加载dll之前从代码更改PATH环境变量。然后可能在之后恢复它。