.NET 无法在同一目录中找到非托管 DLL

Posted

技术标签:

【中文标题】.NET 无法在同一目录中找到非托管 DLL【英文标题】:.NET cannot locate unmanaged DLL in same directory 【发布时间】:2018-12-21 21:51:08 【问题描述】:

我有一个 C++ DLL 库(我们称之为 unmanaged.dll),它被包裹在一个托管的 .NET 库(我们称之为 managed.dll)周围。 managed.dll 使用unmanaged.lib 导入/链接unmanaged.dll。我有另一个使用 managed.dll 的 ASP.NET Web API 项目(我们称项目为 webapi.dll)。现在,每当我构建 Web 项目时,在输出目录中都会得到 webapi.dllmanaged.dll。然后,我手动将unmanaged.dll 复制到同一个输出文件夹中,以便(可能).NET 可以找到它并加载它。 但是,当我尝试运行webapi.dll 时,它会失败并显示无法加载managed.dll 的错误:

无法加载文件或程序集“managed.DLL”或其依赖项之一。找不到指定的模块。

这特别奇怪,因为unmanaged.dll 在同一个文件夹中。 我觉得很奇怪的是,如果我将unmanaged.dll 放在C:\Windows\system32 下,那么.NET 可以正确加载它! 我的问题是如何使这个unmanaged.dll 在.NET 项目输出所在的文件夹中对.NET 可见?

【问题讨论】:

操作系统没有任何理由在与该文件的 .NET 程序集相同的目录中查找。最重要的是因为它完全不知道 CLR 或您的程序做了什么。通常的解决方法是调用 SetDllDirectory() 但这在 Web 服务器上可能不是一个好主意。将目录添加到 PATH 可能是最好的。 【参考方案1】:

这是导致问题的 IIS。有同样的问题,通过将dll添加到位于PATH变量中的文件夹来解决它。

【讨论】:

只是添加到评论中,对于任何面临类似问题的人,在 Global.asax 中 Application_Start() 下的 Web API 项目中,您应该输入如下内容:var path = string.Concat(Environment.GetEnvironmentVariable("PATH"), ";", AppDomain.CurrentDomain.RelativeSearchPath); Environment.SetEnvironmentVariable("PATH", path, EnvironmentVariableTarget.Process); 这将有助于定位您的库在同一个文件夹中

以上是关于.NET 无法在同一目录中找到非托管 DLL的主要内容,如果未能解决你的问题,请参考以下文章

非托管 DLL 函数的正确调用约定

将非托管 DLL 部署到输出目录

在 .NET 控件中部署非托管依赖 dll

从非托管进程中卸载 .NET DLL

同名的非托管 C++ DLL 共存于同一进程中

几个appdomains调用相同的非托管DLL