UiPath NuGet活动组件中Tesseract无法找到x86平台leptonica-1.80.0.dll的解决方案求助
Troubleshooting "Failed to find library 'leptonica-1.80.0.dll' for platform x86" in UiPath Custom Activity NuGet Package
我之前在UiPath自定义活动里处理原生依赖时也碰到过类似问题,咱们一步步来排查解决你的leptonica/tesseract库找不到的问题:
1. 确认NuGet包内容与本地复制设置
- 首先检查Visual Studio项目里所有原生DLL(包括x86/x64目录下的
leptonica-1.80.0.dll、tesseract41.dll,还有tessdata下的训练数据文件)的Copy Local属性是否设为True。UiPath需要这些文件被正确复制到运行目录,不然就会找不到。 - 解压你的NuGet包(把
.nupkg改成.zip),确认内部结构和你本地的lib/net目录一致:x86、x64、tessdata子目录都完整,所有文件都在对应位置。如果Visual Studio打包时漏掉了非托管库,手动在.nuspec文件里添加文件包含规则:<files> <file src="lib/net/x86/*.dll" target="lib/net/x86" /> <file src="lib/net/x64/*.dll" target="lib/net/x64" /> <file src="lib/net/tessdata/*.traineddata" target="lib/net/tessdata" /> <file src="lib/net/Tesseract.dll" target="lib/net" /> <file src="lib/net/YourCustomActivity.dll" target="lib/net" /> </files>
2. 强制UiPath运行时使用x86架构
- UiPath默认可能以AnyCPU模式运行,但原生依赖分平台的话,得明确指定架构:
- 打开你的UiPath项目,进入项目设置 -> 常规,把目标框架设为和你的组件匹配的版本(比如UiPath常用的.NET Framework 4.6.1)。
- 切换到运行时选项卡,把平台设为
x86,重启UiPath Studio后再测试。
- 另外,如果你用的是安装版UiPath,默认启动的是64位的UiRobot,你可以手动启动
C:\Program Files (x86)\UiPath\Studio\UiRobot.exe(x86版本)来运行流程,看是否能找到库。
3. 代码中手动设置原生库加载路径
- Tesseract.NET加载依赖时,可能不会自动遍历x86/x64子目录,你可以在自定义活动的初始化代码里手动添加库搜索路径:
这样能确保程序运行时优先去对应平台的子目录查找原生库。using System.IO; using System.Reflection; using System.Runtime.InteropServices; // 在活动构造函数或Execute方法开头添加以下代码 var assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var platformDir = RuntimeInformation.ProcessArchitecture == Architecture.X86 ? "x86" : "x64"; var nativeLibPath = Path.Combine(assemblyDir, platformDir); // 调用Windows API添加DLL搜索目录 AddDllDirectory(nativeLibPath); // 声明所需的Windows API函数 [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] private static extern bool AddDllDirectory(string lpPathName);
4. 检查UiPath的工作目录
- UiPath运行流程时的工作目录可能和你本地测试应用不一样,导致相对路径失效。你可以在调试时输出当前工作目录确认:
如果发现工作目录不是组件所在目录,就用程序集的绝对路径来拼接tessdata和原生库的路径,避免相对路径的问题。Console.WriteLine($"当前工作目录: {Directory.GetCurrentDirectory()}");
5. 利用UiPath的原生依赖处理机制
- UiPath支持通过
.targets文件自动复制原生依赖到流程输出目录,你可以试试这个方法:- 在NuGet包的
build目录下创建YourCustomActivity.targets文件,内容如下:<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="CopyNativeDependencies" BeforeTargets="Build"> <ItemGroup> <NativeLibsX86 Include="$(MSBuildThisFileDirectory)..\lib\net\x86\*.dll" /> <NativeLibsX64 Include="$(MSBuildThisFileDirectory)..\lib\net\x64\*.dll" /> <TessData Include="$(MSBuildThisFileDirectory)..\lib\net\tessdata\*.traineddata" /> </ItemGroup> <Copy SourceFiles="@(NativeLibsX86)" DestinationFolder="$(OutputPath)x86" /> <Copy SourceFiles="@(NativeLibsX64)" DestinationFolder="$(OutputPath)x64" /> <Copy SourceFiles="@(TessData)" DestinationFolder="$(OutputPath)tessdata" /> </Target> </Project> - 这样当UiPath安装你的NuGet包时,会自动把所有原生依赖复制到流程的输出目录,保证运行时能找到它们。
- 在NuGet包的
内容的提问来源于stack exchange,提问作者Maurizio Bruccoleri
相关产品推荐
相关产品推荐

