【问题标题】:Can't run C++ clr dll from C# - Dll Unloaded?无法从 C# 运行 C++ clr dll - Dll Unloaded?
【发布时间】:2016-01-26 19:43:47
【问题描述】:

我见过几个人有类似的问题,但到目前为止,这些修复都没有奏效。

我有一个 C# 应用程序(Windows 窗体)并且/我正在尝试使用 C++ clr dll。 dll 似乎加载得很好,我可以构建和运行应用程序,但是如果我调用 dll,程序会抛出 FileNotFound 异常“无法加载文件或程序集 'MyLibrary.dll' 或其依赖项之一。指定的模块可以找不到。":"MyLibrary.dll"。

最后一个错误是1008,Error_No_Token

dll 位于 exe 所在的文件夹中。

我一直在用 peverify 和 ildasm 检查东西,但没有发现任何问题。

我在它上面运行了dependency walker,并在日志中看到了这个不寻常的序列:

在地址 0x00007FFB93400000 处卸载“MYLIBRARY.DLL”。

LoadLibraryExW("C:\source\tools\ToolItemProj\ToolItem\ToolItem\bin\x64\Debug\MyLibrary.dll", 0x0000000000000000, LOAD_WITH_ALTERED_SEARCH_PATH) 返回 NULL。错误:找不到指定的模块(126)。

我已经在它上面运行了 ProcMon 并提出了几个整体,其中大多数都成功了,但是 QueryAllInformation 有一个 BufferOverflow 错误,并且 CreateFileMapping 失败(一次), FileLockedWithOnlyReaders (然后它再次运行并成功)。创建 INI 似乎也因 NameNotFound 而失败。

因此,由于缓冲区溢出,它看起来像是在运行时卸载 dll。但是,我该如何追踪呢?有人有这方面的经验吗?

【问题讨论】:

  • 通常“找不到指定的模块”表示缺少某些 dll。您的 vcredist(x64) 是否安装正确? C++ dll 是否依赖于您可能忘记放在程序集目录或搜索路径下的任何内容?另外,C++ dll 是用 x64 编译的吗?

标签: c# c++ dll


【解决方案1】:

这个问题已经解决了。该 dll 包含另一个我没有的 dll。我能够通过原始开发人员跟踪这个 dll。

【讨论】:

  • 对于这种情况,“Dependency Walker”工具非常宝贵。它带有许多版本的 Windows SDK(以前称为 Platform SDK),也可以在 dependencywalker.com 单独获得。你打开一个DLL。它将读取导入列表并告诉您哪些 DLL 需要但未找到,并显示找到的那些 DLL 的版本信息(以防版本不匹配是您的问题)。
猜你喜欢
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多