关于C#:相对于dll的LoadLibrary()相对地址

LoadLibrary() relative address to dll

我正在尝试在Windows中的代码中加载dll,我使用LoadLibrary()函数成功加载了dll,但是我有一个问题,我给出了dll的路径,如下所示:

1
LoadLibrary(C:\\\\path\\\\to\\\\my\\\\dll);

我想知道我是否可以提供dll的相对路径。我的意思是例如:

1
LoadLibrary(.\\my dll directory\\my dll.dll)

有可能吗?如果没有,如何在不更改其他计算机中dll路径的情况下开发可移植的项目?


最有可能失败的原因是您在第二次调用LoadLibrary时忘记了转义反斜杠。写下问题时可能是错字,因为您也忘记了文件名的引号。 ;)也就是说,更改此行:

1
LoadLibrary(.\\my dll directory\\my dll.dll);

要这样:

1
LoadLibrary(L".\\\\my dll directory\\\\my dll.dll");

(而且我不确定是否需要前导.\\\\)

如果这不能解决问题,那么很可能会满足您的需求:

1
2
3
4
wchar_t szFullPath[MAX_PATH] = {};
GetCurrentDirectory(MAX_PATH, szFullPath);
PathCchAppend(szFullPath, MAX_PATH, L"my dll directory\\\\my dll.dll");
HMODULE hDLL = LoadLibrary(szFullPath);

最后,LoadLibrary在搜索依赖的DLL时具有不同的行为。并且根据您指定路径的方式而有所不同。这可能会影响您从相对搜索路径加载DLL的能力。阅读其上的MSDN页面,并考虑查看各种选项调用,例如LoadLibraryEx和SetDllDirectory可以使搜索路径更易于处理。此页面上的DLL搜索路径也是如此。


首先,我假设您要编写:

1
LoadLibrary(".\\\\my dll directory\\\\my dll.dll");

文档回答了您的问题:

If a relative path is specified, the entire relative path is appended to every token in the DLL search path list. To load a module from a relative path without searching any other path, use GetFullPathName to get a nonrelative path and call LoadLibrary with the nonrelative path.

是的,您可以指定相对路径。但是它的解释方式可能不是您所期望的。 DLL搜索将依次采用DLL搜索路径中的每个路径,并将其与您的相对路径合并,然后尝试加载该DLL。

因此,如果您希望相对路径相对于当前工作目录,请调用GetFullPathName将其扩展为绝对路径,然后加载该路径。如果要相对路径相对于其他目录进行解释,请与该目录结合并使用绝对路径加载DLL。