.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.dll
和 managed.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的主要内容,如果未能解决你的问题,请参考以下文章