c# - 如何找到无法加载 "A procedure imported by ' xxx.dll 的源。”异常?

标签 c# c++ dll unmanaged managed

过去一周我一直在寻找这个异常(exception)。

情况是:

我有一个用 C# 编写并在 Visual Studio 2010 中构建的应用程序。 该应用程序包含一个 DLL,它是非托管代码库的包装器。 非托管代码是用 C++ 编写的,并在 Visual Studio 2008 中构建。这是必需的,因为代码引用了额外的库 (Qt),并且该代码以 WinCE 版本 5 为目标(由于现场支持的设备,这是必需的)。

我已经尝试了我在这里看到的许多建议,包括使用各种依赖遍历器(VS 2008 依赖、dependency_walker 和 Dependz)以及其他工具,例如来自 SysInternals 的 Reflector 和 Process Monitor。

所有工具都没有显示问题 (Reflector) 或在我的环境 (Win 7) 中过时的旧依赖项,如 DCOMP.DLL、GPSVC.DLL 和 IESHIMS.DLL。

在调试器中,我可以单步执行我的代码,直到我实例化一个引用我的托管包装器 DLL 的对象。它不进入对象的实例化,而是立即抛出异常。

在 Process Explorer(来自 SysInternals)中,我可以看到已加载的托管 DLL,以及必要的附属 DLL。在出现问题的过程监视器(来自 SysInternals)中,没有未找到消息的堆栈。它只是失败了。

任何发现此问题的想法或想法将不胜感激。

最佳答案

@ Hans Passat - 感谢您对全局标志的提示。

Here是一篇关于使用这些工具的优秀博客文章。大多数 Google 对“显示加载器堆栈”的引用所指的 gflags.exe 程序是 Windows 设备驱动程序开发工具包 (WinDDK) 的一部分,它为您管理该帖子中提到的注册表设置。

使用“Show Loader Stacks”运行的输出表明,一个本应位于我的非托管 DLL 中的符号不​​在我使用的 DLL 中。

事实证明,我正在构建错误版本的 DLL。这是由于我对构建过程的理解不足(太多版本构建了太多不同的方式)。

关于c# - 如何找到无法加载 "A procedure imported by ' xxx.dll 的源。”异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18198163/

相关文章:

c++ - 我需要在此代码中调用 SafeArrayUnLock 吗?

c++ - 在适用于 Linux 的 Eclipse (C++) 中链接到 matlab 库

c# - RGiesecke dll 导出模板

delphi - 第 3 方 dll 中未处理的 delphi 异常

c# - 如何将字符串参数从 C++ 传递到托管 C# DLL

c# - 使用 ImapX 阅读电子邮件时返回意外字符

c# - 让NHibernate透明的存储一个字节数组到文件系统或者S3

c++ - 如何使用 gcc/g++ 11.1 导入模块

c# - 在运行时从 txt 文件更新文本框而不单击 "refresh"

c# - 实习生字符串文字误解?