如何调试“System.DllNotFoundException:找不到指定的过程”?

时间:2015-08-19 12:39:54

标签: c# winapi pinvoke

我为某个原生DLL设置了一个PInvoke包装器,但是当我尝试从它调用任何东西时,它会崩溃,说System.DllNotFoundException: The specified procedure could not be found

我已经检查过的事情:

  • DLL与EXE位于同一文件夹中。
  • Dependency Walker显示DLL只有一个非系统DLL依赖项,此时它已经(成功)加载到进程中。
  • 无论我试图调用哪个函数,它都会产生相同的错误,包括没有正文的虚函数。 (所以points 1 and 3 from the answer here不适用。)
  • 我使用了Dependency Walker来确保导出的函数具有相同的名称,包括区分大小写。

到目前为止,我只是在我的智慧结束。我该怎么调试这个并找出实际出错的地方?我得到的错误信息是有用的一大堆失败;它甚至没有告诉我它找不到的程序的名称。

2 个答案:

答案 0 :(得分:2)

我首先在本机应用程序中调试它。由于原因,我稍后会解释。

将一个简单的控制台应用程序放在与C#可执行文件相同的目录中。让该控制台应用程序在您正在调用的DLL上调用LoadLibraryGetProcAddress。是否会发生同样的错误?

如果确实发生了错误,您现在可以在配置文件模式下使用Dependency Walker进行调试。将控制台应用程序加载到Dependency Walker中。然后使用“配置文件”菜单上的操作来检测执行的应用程序。您应该看到那里报告的错误,并且您将确切地知道无法找到哪个功能。

依据我所知,Dependency Walker与.net不兼容,因此是本机测试主机。

如果错误没有发生,那么更深层次的事情就是错误

答案 1 :(得分:1)

使用gflags.exe为您的应用启用Loader snaps

这应该提供与进程的调试输出上的dll加载/解析相关的大量信息,您可以跟踪它以查看它失败的位置。

更多信息:Angular docs

请注意:根据您的visual studio设置,您的代码将在ProjectName.vshost.exeProjectName.exe

中运行