【问题标题】:Native DLL Not found未找到本机 DLL
【发布时间】:2015-12-07 17:06:19
【问题描述】:

我有一个使用 Tesseract 从图像中提取文本的程序。我通过 P/Invoke 制作了一个用于 C# 的 Native C++ DLL。我的 C# 应用程序是基于 x64 的控制台,并且 DLL 也是 64 位的。

部署到 Windows Server 后,我收到一个错误,提示 DLL(我制作的)不存在。错误信息如下。

System.DllNotFoundException:无法加载 DLL 'TesseractX64.dll':找不到指定的模块。 (来自 HRESULT 的异常:0x8007007E)在 Utilities.Finance.PDFParser.PDF.OCRObject.GetUTF8Text(字符串路径,字符串语言,字符串 imgPath)

我确定 DLL 存在于该路径中。 TesseractX64.DLL 与 C# 应用程序位于同一文件夹中,因此它应该可以正常工作。

这是我的代码:

[HandleProcessCorruptedStateExceptions]
[DllImport(@"TesseractX64.dll", EntryPoint = "GetUTF8Text", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr GetUTF8Text(string path, string lang, string imgPath);

到目前为止我所尝试的:

  1. 将 DLLImport 路径设置为相对路径,例如 C:\DLL\Tesseract.DLL。还是同样的问题。
  2. 安装了 Visual C++ 2005 - 2012 x86 和 x64。还是同样的问题。

它在我用来开发程序的 Windows 7 x64 计算机上运行良好。

【问题讨论】:

  • 检查您的基础目录是否与您启动应用程序的位置相同。
  • 消息显示unable to load。这并不一定意味着 .dll 不存在,但可能无法加载它,因为它依赖于其他无法找到的 .dll。
  • @dxiv:感谢您指出这一点。我去看看。

标签: c# c++ pinvoke


【解决方案1】:

要么:

  1. 找不到 DLL,或者
  2. 找不到 DLL 的依赖项之一。

将 DLL 与可执行文件放在同一目录中,以确保可以找到它。

确保在需要运行您的软件的每台机器上都满足所有 DLL 的依赖关系。这将涉及首先弄清楚这些依赖项是什么。 DLL 的文档应该会告诉您这些信息。通常这意味着安装链接 DLL 的 MSVC 运行时。

您不得重新分发调试运行时。即使 .NET 代码处于调试模式,您也需要制作本机 DLL 的发布版本。

【讨论】:

  • Dependency Walker 是一个很好的实用程序,可以递归查找所有依赖项以及哪些依赖项加载失败。
  • @David 我已经复制了所有必需的 DLL 文件,并且不需要其他 DLL。 DLL 与可执行文件位于同一目录中。
  • 嗯,系统不同意你。系统抛出 System.DllNotFoundException 告诉您它认为需要其他 DLL。
  • 这是调试运行时。不允许您重新分发调试运行时。您需要制作 DLL 的发布版本。
猜你喜欢
  • 2021-12-25
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多