非托管DLL加载路径

问题描述 投票:1回答:2

我有一个托管c ++ / cli项目,该项目包装了一个非托管dll。

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

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

我必须做什么,以便我的dll被复制到输出目录,并且我必须提供给LoadLibrary的路径?

.net dll c++-cli
2个回答
1
投票

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

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

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

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

    您当前的workind目录
  • 系统DLL目录,例如%windir%\ system32
  • 请检查文档:LoadLibraryA function例如,提到的“ SetDllDirectory”对您来说非常有用。另外,以下是详细解释的搜索路径顺序:Dynamic-Link Library Search Order

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


  • 1
    投票
    要从当前目录或exe目录加载库,仅库名就足够了,没有路径。有关完整的Dll搜索顺序,请参阅动态链接库搜索顺序http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx

    从中加载应用程序的目录。当前目录。系统目录。使用GetSystemDirectory函数获取此目录的路径。16位系统目录。没有获取该目录路径的函数,但会对其进行搜索。Windows目录。使用GetWindowsDirectory函数获取此目录的路径。PATH环境变量中列出的目录。

    如果要将库复制到输出目录,请将此库项目添加到解决方案中。添加模块将在同一目录中。您也可以在mylib项目中使用构建后步骤将mylib.dll复制到所需的任何目录。
    © www.soinside.com 2019 - 2024. All rights reserved.