C#调用Tesseract报错System.DllNotFoundException

程序在C#中使用Tesseract OCR时,发布后出现System.DllNotFoundException错误,提示找不到leptonica-1.78.0.dll。问题在于发布时未将所有dll文件包含进安装包。解决方案是将x86和x64文件夹完整复制到程序根目录,因为Tesseract会在此目录下寻找对应的dll文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#调用Tesseract报错System.DllNotFoundException

一、程序发布安装后出现错误

在使用C#语言编写程序,调用Tesseract——OCR识别引擎时,在程序调试阶段不会出现任何错误,但当发布程序后,在自己电脑或目标主机安装程序并运行时,可能会莫名其妙程序崩溃,错误信息提示System.DllNotFoundException错误,使用VS调试发现错误信息为:
System.Reflection.TargetInvocationException:“调用的目标发生了异常。”
内部异常
DllNotFoundException: Failed to find library “leptonica-1.78.0.dll” for platform x64.

如下图所示
在这里插入图片描述
经过仔细分析并上网查找资料,发现错误引发原因并不是Tesseract版本过高或系统缺少VC++2015等程序,因为在调试阶段程序可以正常运行,而在发布安装时报错缺少dll文件,说明最大的可能是程序在发布时可能没有将全部dll文件复制进安装包内。

二、解决该bug方法

通过调试发现错误原因是缺少leptonica-1.78.0.dll,而在通过nuget下载的Tesseract包内存在该dll文件,并且x86和x64文件夹下各有一个,因此将对应位数的dll复制到程序根目录下,再运行程序,发现依然提示找不到leptonica-1.78.0.dll。
后面经过各种排查发现,将x86或x64文件夹整个复制到程序根目录下,程序能够正常运行,根本原因是Tesseract并不是从程序根目录下寻找dll文件,而是先寻找根目录下有无x86或x64文件夹,如果有再从文件夹下寻找dll文件,这点与通常从根目录下寻找dll文件不一样,导致debug了很长时间才解决。

### Tesseract 中 `System.Reflection.TargetInvocationException` 的解决方案 #### 错误分析 在使用 Tesseract OCR 引擎时,如果遇到 `System.Reflection.TargetInvocationException` 错误,通常是因为底层依赖的动态链接库 (DLL) 文件缺失或路径配置不正确。具体来说,此错误是由内部异常 `DllNotFoundException` 引发的,表明程序无法找到所需的 DLL 文件,例如 `tesseract41.dll` 或 `leptonica-1.78.0.dll`[^3]。 这种问题常见于以下场景: - 发布后的应用程序未能将所有必要的 DLL 文件打包到安装目录中。 - 运行环境未满足 Tesseract 和 Leptonica 所需的依赖项(如 Visual C++ Redistributable)。 - 程序运行平台与编译目标平台不符(如 x64 应用尝试加载 x86 版本的 DLL)。 --- #### 解决方案 ##### 方法一:确认并添加所需 DLL 文件 确保项目中包含了 Tesseract 和 Leptonica 所需的所有必要 DLL 文件,并将其部署到最终用户的环境中。以下是常见的 DLL 列表及其作用: | **DLL 名称** | **功能描述** | |-------------------------|-----------------------------------------------------------------------------| | tesseract41.dll | 提供核心 OCR 功能 | | leptonica-1.78.0.dll | 图像处理支持 | 这些文件应放置在同一目录下作为可执行文件的一部分。可以通过以下方式验证其存在性和可用性: 1. 使用资源管理器检查发布目录中的 DLL 是否齐全。 2. 如果仍存在问题,可以手动指定 DLL 加载路径,如下所示: ```csharp using System; using System.Runtime.InteropServices; class Program { static void Main() { try { var pathToDll = @"C:\Path\To\tesseract41.dll"; LoadLibrary(pathToDll); // 显式加载 DLL Console.WriteLine("DLL loaded successfully."); } catch (Exception ex) { Console.WriteLine($"Error loading DLL: {ex.Message}"); } } [DllImport("kernel32", SetLastError = true)] private static extern IntPtr LoadLibrary(string dllToLoad); } ``` --- ##### 方法二:调整项目的构建设置 确保开发环境和目标运行环境一致。对于 .NET 项目,建议完成以下操作: 1. 配置项目为目标架构(x86 或 x64),并与使用的 Tesseract/Leptonica DLL 架构匹配。 - 右键单击项目 -> 属性 -> Build -> Platform target 设置为 `x64` 或 `Any CPU`。 2. 安装适用于目标系统的 Microsoft Visual C++ Redistributable 包。这通常是解决许多 Windows 平台上的 DLL 缺失问题的关键[^3]。 下载地址:https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170 --- ##### 方法三:捕获并记录异常细节 为了更精确地定位问题根源,可以在代码中增加详细的日志记录机制来捕捉异常堆栈信息。例如: ```csharp try { using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default)) { using (var img = Pix.LoadFromFile("test.png")) using (var page = engine.Process(img)) { string text = page.GetText(); Console.WriteLine(text); } } } catch (TargetInvocationException tie) { Console.Error.WriteLine("An exception occurred while invoking the method:"); Console.Error.WriteLine(tie.InnerException?.Message ?? "No inner exception details available."); } catch (DllNotFoundException dnfe) { Console.Error.WriteLine("A required DLL was not found:"); Console.Error.WriteLine(dnfe.Message); } ``` 通过这种方式,能够获取更多关于异常的具体上下文信息,从而更快解决问题。 --- ##### 方法四:重新评估第三方组件版本兼容性 有时,Tesseract 和其他依赖项之间的版本冲突也可能导致此类问题。因此,推荐遵循官方文档或社区指南选择经过测试稳定的组合版本。例如: - Tesseract v4.x 需要搭配 Leptonica v1.78.x 或更高版本。 - 若不确定当前版本是否适配,则考虑降级至已知稳定版。 --- ### 总结 综上所述,针对 `System.Reflection.TargetInvocationException` 错误的核心在于排查并修复底层 DLL 文件丢失或加载失败的情况。按照上述方法逐一实施即可有效缓解甚至彻底消除该类问题的发生概率。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值