如何调试 "System.DllNotFoundException: The specified procedure could not be found"?
How do I debug "System.DllNotFoundException: The specified procedure could not be found"?
我已经为某个本机 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 来确保导出的函数具有相同的名称,包括区分大小写。
至此,我已经无计可施了。我怎样才能调试它并弄清楚到底出了什么问题?我得到的错误信息是一堆关于有用性的失败信息;它甚至没有告诉我它找不到的过程的名称。
使用 gflags.exe
为您的应用程序启用 Loader snaps
。
这应该会在进程的调试输出上提供大量与 dll 加载/解析相关的信息,您可以跟踪这些信息以查看失败的位置。
更多信息:Debugging LoadLibrary Failures
请注意:根据您的 visual studio 设置,您的代码将 运行 ProjectName.vshost.exe
或 ProjectName.exe
我会先在本机应用程序中调试它。原因我稍后会解释。
将一个简单的控制台应用程序放在与 C# 可执行文件相同的目录中。让那个控制台应用程序在 DLL 上调用 LoadLibrary
和 GetProcAddress
你是 p/invoking。是否出现同样的错误?
如果错误确实发生,您现在可以在配置文件模式下使用 Dependency Walker 进行调试。将控制台应用加载到 Dependency Walker 中。然后使用配置文件菜单上的操作来检测正在执行的应用程序。您应该会看到那里报告的错误,并且您会确切地知道找不到哪个函数。
据我所知,Dependency Walker 不能很好地与 .net 配合使用,因此是本机测试主机。
如果没有出现错误,则说明有更深层次的问题
我已经为某个本机 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 来确保导出的函数具有相同的名称,包括区分大小写。
至此,我已经无计可施了。我怎样才能调试它并弄清楚到底出了什么问题?我得到的错误信息是一堆关于有用性的失败信息;它甚至没有告诉我它找不到的过程的名称。
使用 gflags.exe
为您的应用程序启用 Loader snaps
。
这应该会在进程的调试输出上提供大量与 dll 加载/解析相关的信息,您可以跟踪这些信息以查看失败的位置。
更多信息:Debugging LoadLibrary Failures
请注意:根据您的 visual studio 设置,您的代码将 运行 ProjectName.vshost.exe
或 ProjectName.exe
我会先在本机应用程序中调试它。原因我稍后会解释。
将一个简单的控制台应用程序放在与 C# 可执行文件相同的目录中。让那个控制台应用程序在 DLL 上调用 LoadLibrary
和 GetProcAddress
你是 p/invoking。是否出现同样的错误?
如果错误确实发生,您现在可以在配置文件模式下使用 Dependency Walker 进行调试。将控制台应用加载到 Dependency Walker 中。然后使用配置文件菜单上的操作来检测正在执行的应用程序。您应该会看到那里报告的错误,并且您会确切地知道找不到哪个函数。
据我所知,Dependency Walker 不能很好地与 .net 配合使用,因此是本机测试主机。
如果没有出现错误,则说明有更深层次的问题