【问题标题】:How do I find the source of a "A procedure imported by 'xxx.dll' could not be loaded." exception?如何找到“无法加载由‘xxx.dll’导入的过程”的来源。例外?
【发布时间】:2013-08-12 23:14:26
【问题描述】:

过去一周我一直在寻找这个例外。

情况是:

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

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

所有工具要么显示没有问题(反射器),要么显示在我的环境(Win 7)中已过时的旧依赖项,如 DCOMP.DLL、GPSVC.DLL 和 IESHIMS.DLL。

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

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

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

【问题讨论】:

  • 您在台式机上使用用于 CE 的 Qt 版本?不要再看了 :) 如果您需要诊断,请使用 Google“加载程序快照”。
  • 其实没有。我们在 Windows 和 Windows CE 版本中重建 Qt。但是每个运行的代码都是一样的。
  • 我会首先将加载托管和非托管部分的问题分开。将您的包装器转换为存根并尝试加载它。将您的 C++ dll 加载到本机进程中,看看这是否可行。发布包装器的代码片段可能会很有帮助。

标签: c# c++ dll unmanaged managed


【解决方案1】:

@Hans Passat - 感谢您对 Global Flags 的提示。

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

使用“显示加载程序堆栈”运行的输出表明,应该在我的非托管 DLL 中的符号不​​在我正在使用的 DLL 中。

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

【讨论】:

    【解决方案2】:

    工作的标准工具:Dependency Walker

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多