我为某个原生DLL设置了一个PInvoke包装器,但是当我尝试从它调用任何东西时,它会崩溃,说System.DllNotFoundException: The specified procedure could not be found
。
我已经检查过的事情:
到目前为止,我只是在我的智慧结束。我该怎么调试这个并找出实际出错的地方?我得到的错误信息是有用的一大堆失败;它甚至没有告诉我它找不到的程序的名称。
答案 0 :(得分:2)
我首先在本机应用程序中调试它。由于原因,我稍后会解释。
将一个简单的控制台应用程序放在与C#可执行文件相同的目录中。让该控制台应用程序在您正在调用的DLL上调用LoadLibrary
和GetProcAddress
。是否会发生同样的错误?
如果确实发生了错误,您现在可以在配置文件模式下使用Dependency Walker进行调试。将控制台应用程序加载到Dependency Walker中。然后使用“配置文件”菜单上的操作来检测执行的应用程序。您应该看到那里报告的错误,并且您将确切地知道无法找到哪个功能。
依据我所知,Dependency Walker与.net不兼容,因此是本机测试主机。
如果错误没有发生,那么更深层次的事情就是错误
答案 1 :(得分:1)
使用gflags.exe
为您的应用启用Loader snaps
。
这应该提供与进程的调试输出上的dll加载/解析相关的大量信息,您可以跟踪它以查看它失败的位置。
更多信息:Angular docs
请注意:根据您的visual studio设置,您的代码将在ProjectName.vshost.exe
或ProjectName.exe