System.DllNotFoundException 在 .NET Core 应用程序中

System.DllNotFoundException in .NET Core application

在 .NET Core 应用程序中,当我尝试 运行 我的单元测试项目时遇到此错误:

System.DllNotFoundException: Unable to load DLL 'opencv_core246' or one of its dependencies: The specified module could not be found. (0x8007007E)

DLLImport 行仅使用 'opencv_core246'(无路径),所以我的理解是 运行time 应该在与可执行文件本身相同的目录中查找(或者失败 Windows/System32 或 Windows/SystemWOW64)。它现在在所有三个位置只是为了它的地狱,但仍然没有骰子。我的同事有相同的设置(我的是 Windows VM 运行 在 Parallels 上 Mac 而他的是本地 Windows 但这不重要)和他的测试 运行 OK。任何关于如何调试这个的想法表示赞赏。

首先,请不要在您的系统中到处喷洒 DLL。那只会让生活变得复杂。删除系统目录中的 DLL,永远不要再修改这些目录。他们是系统的,不是你的。

现在,如果找不到 DLL,或者找不到其依赖项之一,您将得到 DllNotFoundException。将找到 DLL,因为它位于可执行文件旁边。因此,找不到依赖项之一。找出依赖项是什么,并确保可以解决它们。

我正在添加我自己的答案,以防这对其他人有帮助。正如接受的答案所表明的那样,我确实缺少本机 dll (opencv_core246) 的依赖项。问题是如何找出这些依赖项是什么。我使用了一个名为 dependency walker 的实用程序,但这给出了相当混乱的结果——它似乎表明我缺少 windows 内核!澄清问题的是使用 Microsoft 的 C++ 编译器附带的 dumpbin 实用程序。你可以这样使用:

dumpbin /DEPENDENTS <my.dll>

这表明我的 dll 有三个依赖项,内核加上两个是 C++ redist 包的一部分,但我的系统上没有安装。安装修复了缺少的依赖项问题。

编辑:实际上,依赖遍历器结果比 dumpbin 更深入地挖掘依赖树,因此您可以使用它来获得相同的结果。 dll 依赖项位于结果树的顶层。