【问题标题】:Unmanaged DLL loading path非托管 DLL 加载路径
【发布时间】:2012-11-07 09:45:03
【问题描述】:

我有一个包含非托管 dll 的托管 c++/cli 项目。

我用LoadLibrary 加载非托管dll,但LoadLibrary 调用找不到我的dll。

  HMODULE theDllHell = LoadLibrary(L"mylib.dll");

我必须做什么才能将我的 dll 复制到输出目录,我必须向LoadLibrary 提供什么路径?

【问题讨论】:

    标签: .net dll c++-cli


    【解决方案1】:

    首先:假设您已将 DLL 添加到项目中,并且它在 SolutionExplorer 面板中可见,只需右键单击它并:

    • 在“内容”的 BuildAction 中
    • 在 CopyToOutputDir 中选择“CopyIfNewer”

    如果我没有记错选项,现在应该在合理的情况下将其复制到输出目录。参考:File Properties on MSDN

    第二:LoadLibrary 以传统的 Windows 特定顺序搜索一系列路径。您可以几乎始终确定的路径是:

    • 您当前的工作目录
    • 系统 DLL 目录,例如 %windir%\system32

    请查看文档:LoadLibraryA function 例如提到的“SetDllDirectory”,您认为它非常有用。另外,这里是详细解释的搜索路径顺序:Dynamic-Link Library Search Order

    编辑:当然,您可以向 LoadLibrary 提供文件的 CWD 相对或完整绝对路径。这总能解决问题,但是 - 我不建议这样做,因为当应用程序要在各种版本和语言的操作系统上运行时,手动确定路径可能不是一件容易的事!

    【讨论】:

      【解决方案2】:

      要从当前目录或 exe 目录加载库,只需库名即可,无需路径。有关完整的 Dll 搜索顺序,请参阅动态链接库搜索顺序http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx

      加载应用程序的目录。 当前目录。 系统目录。使用 GetSystemDirectory 函数获取该目录的路径。 16 位系统目录。没有获取这个目录的路径的函数,但是被搜索了。 Windows 目录。使用 GetWindowsDirectory 函数获取该目录的路径。 PATH 环境变量中列出的目录。

      如果要将库复制到输出目录,请将此库项目添加到解决方案。添加模块将位于同一目录中。您还可以在 mylib 项目中使用 Post-Build Step 将 mylib.dll 复制到您需要的任何目录。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 2014-03-08
      • 2017-10-16
      • 2014-04-16
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多