Tesseract: Маршалинг к указателям COM-интерфейса и обратно не поддерживается (.net core 2.1).

Созданный на 31 июл. 2018  ·  9Комментарии  ·  Источник: charlesw/tesseract

Centos7 64-битный .net core2.1
было выброшено исключение при запуске

System.Reflection.TargetInvocationException: цель вызова сгенерировала исключение. ---> System.Runtime.InteropServices.MarshalDirectiveException: невозможно маршалировать «параметр № 2»: недопустимая комбинация управляемого и неуправляемого типов (Маршалинг в и из указателей COM-интерфейса не поддерживается).
в System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointerInternal (IntPtr ptr, Type t)
в System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer (IntPtr ptr, Type t)
at InteropRuntimeImplementer.TessApiSignaturesInstance.TessApiSignaturesImplementation..ctor (загрузчик LibraryLoader)
--- Конец внутренней трассировки стека исключений ---
в System.RuntimeMethodHandle.InvokeMethod (целевой объект, аргументы Object[], знак подписи, логический конструктор, логические исключения обертывания)
в System.Reflection.RuntimeConstructorInfo.Invoke (BindingFlags invokeAttr, связыватель Binder, параметры Object [], культура CultureInfo)
в System.RuntimeType.CreateInstanceImpl (BindingFlags bindingAttr, связыватель Binder, Object [] args, культура CultureInfo, Object [] активация Attributes)
в InteropDotNet.InteropRuntimeImplementer.CreateInstance T
в Tesseract.Interop.TessApi.Initialize()
в Tesseract.Interop.TessApi.get_Native()
at Tesseract.TesseractEngine..ctor(String datapath, String language, EngineMode engineMode, IEnumerable 1 configFiles, IDictionary 2 initialOptions, логическое значение setOnlyNonDebugVariables)
в TesseractCore.Program.Main (строка [] аргументы)

Все 9 Комментарий

Во-первых, это отличная работа и супер качественная библиотека!

Я также очень заинтересован в том, чтобы это работало в Linux с использованием .NET Core. По-видимому, я получаю то же сообщение об ошибке, но чтобы зайти так далеко, мне пришлось немного повозиться.

1) Я пытаюсь это сделать из функциональной ветки 321-Tesseract-4. Моя тестовая среда — Ubuntu 18.04 x64 с .NET Core 2.1.
2) Следующий вопрос заключался в том, как предоставить собственные библиотеки tesseract для оболочки Tesseract.dll. Поэтому, чтобы он не запрашивал конкретно названные файлы библиотеки, я изменил

        public const string LeptonicaDllName = "liblept1760";
        public const string TesseractDllName = "libtesseract400";

к

        public const string LeptonicaDllName = "liblept";
        public const string TesseractDllName = "libtesseract";

поэтому в результате он примет libtesseract.so, предоставленный Ubuntu.
3) Я также пробовал это на Mac с High Sierra. Tesseract собран из исходников (4.0.0 beta 3). После изменения расширения .so на .dylib в UnixLibraryLoaderLogic.cs (строка 58 и далее) я, наконец, получил такое же сообщение об ошибке.

К сожалению, я недостаточно знаю, чтобы исправить это или работать над этой проблемой. Если есть что-то, что я мог бы проверить или сделать, чтобы поддержать это усилие, пожалуйста, дайте мне знать.

Я попытался углубиться в проблему. Извините, если что-то из этого звучит глупо, но я не совсем понимаю, что происходит, и могу описать только с моим твердым полузнанием.

Итак, вот оно. Когда необходимые собственные библиотеки загружаются, получаются дескрипторы для библиотеки и всех необходимых вызовов методов. Кажется, это удалось для Лептоники, но для Тессеракта это не удалось.

Вот вывод трассировки до сбоя:

INFO: Trying to load native function "TessBaseAPIGetThresholdedImage" from the library with handle 140712712753840...
INFO: Successfully loaded native function "TessBaseAPIGetThresholdedImage", function handle = 4488118128.
INFO: Trying to load native function "TessBaseAPIProcessPages" from the library with handle 140712712753840...
INFO: Successfully loaded native function "TessBaseAPIProcessPages", function handle = 4488118416.
INFO: Trying to load native function "TessBaseAPIProcessPage" from the library with handle 140712712753840...
INFO: Successfully loaded native function "TessBaseAPIProcessPage", function handle = 4488118432.

Глядя на TessBaseAPIProcessPage, он сопоставляется с BaseAPIProcessPage в BaseApi.cs следующим образом:

[RuntimeDllImport(Constants.TesseractDllName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "TessBaseAPIProcessPage")]
int BaseAPIProcessPage(HandleRef handle, Pix pix, int page_index, string filename, string retry_config, int timeout_millisec, HandleRef renderer);

Теперь я подозреваю, что эта ссылка на пикс виновата. Это второй параметр (невозможно маршалировать «параметр № 2»: недопустимая комбинация управляемого/неуправляемого типа (Маршалинг в и из указателей COM-интерфейса не поддерживается). Кроме того, кажется, что эти функции загружаются в порядке появления в BaseApi.cs . Эта ссылка на пикс является первым вхождением нетривиального класса (например, не базового типа, не перечисления) этих вызовов. Имеет ли это смысл?

Может ли это быть ошибкой в ​​.NET Core в Unix?

У меня такая же проблема на Fedora28.

Уважаемый HelGeL, не могли бы вы также указать, как вы получили вывод Trace? Я не смог понять, что я должен сделать, чтобы увидеть след.

Что ж, мой код заработал после комментирования объявления BaseAPIProcessPage.

Спасибо за информацию! Я тоже пробовал, и теперь код работает в Unix.

Кстати, мне нужно прочитать вывод Trace, просто поместив Console.WriteLines в Logger.cs.

Да, спасибо за информацию, я посмотрю, почему этот вызов не работает, и посмотрю,
мы можем получить сборку Linux вместе.

Вт., 4 сент. 2018, 03:16 HelgeL, уведомления@github.com написал:

Спасибо за информацию! Я тоже пробовал, и теперь код работает в Unix.

Кстати, мне нужно прочитать вывод Trace, просто поместив Console.WriteLines в
Logger.cs.


Вы получаете это, потому что подписаны на эту тему.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/charlesw/tesseract/issues/433#issuecomment-418164476 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AAPzyLRHCIWPj2YBMNtB06uLVJspp_ipks5uXWQFgaJpZM4VoNQB
.

Наверное такая же проблема. Я получаю эту ошибку в Ubuntu 16.04., (ASP).NET Core, Tesseract 4
System.DllNotFoundException: Failed to find library "liblept1760.so" for platform x64.

Я сделал пакет nuget для версии tesseract 4.0 с фиксированным API. Проверено на CentOS 7.
Бытие.Tesseract4

Была ли эта страница полезной?
0 / 5 - 0 рейтинги