Tesseract: No se admite la clasificación hacia y desde los punteros de la interfaz COM (.net core 2.1)

Creado en 31 jul. 2018  ·  9Comentarios  ·  Fuente: charlesw/tesseract

centos7 64 bits .net core2.1
se lanzó una excepción al ejecutar

System.Reflection.TargetInvocationException: el destino de una invocación ha lanzado una excepción. ---> System.Runtime.InteropServices.MarshalDirectiveException: no se puede calcular el 'parámetro n.º 2': combinación de tipo administrado/no administrado no válida (no se admite el cálculo de referencias hacia y desde los punteros de la interfaz COM).
en System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointerInternal(IntPtr ptr, Type t)
en System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(IntPtr ptr, Type t)
en InteropRuntimeImplementer.TessApiSignaturesInstance.TessApiSignaturesImplementation..ctor(LibraryLoader loader)
--- Fin del seguimiento de la pila de excepción interna ---
en System.RuntimeMethodHandle.InvokeMethod(Objeto objetivo, Objeto[] argumentos, Firma sig, Constructor booleano, Boolean wrapExceptions)
en System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invocarAttr, Binder binder, Object[] parámetros, CultureInfo cultura)
en System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activaciónAttributes)
en InteropDotNet.InteropRuntimeImplementer.CreateInstance T
en Tesseract.Interop.TessApi.Initialize()
en Tesseract.Interop.TessApi.get_Native()
en Tesseract.TesseractEngine..ctor(String datapath, String language, EngineMode engineMode, IEnumerable 1 configFiles, IDictionary 2 initialOptions, Boolean setOnlyNonDebugVariables)
en TesseractCore.Program.Main(String[] argumentos)

Todos 9 comentarios

Primero, ¡este es un gran trabajo y una biblioteca de gran calidad!

También estoy muy interesado en hacer que esto se ejecute en Linux usando .NET Core. Aparentemente recibo el mismo mensaje de error, pero para llegar tan lejos tuve que hacer algunos cambios.

1) Estoy intentando esto desde la rama de funciones 321-Tesseract-4. Mi entorno de prueba es Ubuntu 18.04 x64 con .NET Core 2.1.
2) La siguiente pregunta fue cómo proporcionar las bibliotecas tesseract nativas para el envoltorio Tesseract.dll. Entonces, para evitar que solicite los archivos de biblioteca con nombres específicos, cambié

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

para

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

entonces, como resultado, aceptaría libtesseract.so tal como lo proporciona Ubuntu.
3) También probé esto en una Mac con High Sierra. Tesseract construido desde la fuente (4.0.0 beta 3). Después de cambiar las extensiones .so a .dylib en UnixLibraryLoaderLogic.cs (línea 58 en adelante), finalmente recibí el mismo mensaje de error.

Desafortunadamente, no sé lo suficiente para solucionar esto o trabajar en este problema. Si hay algo que pueda probar o hacer para apoyar este esfuerzo, házmelo saber.

Traté de profundizar más en el tema. Lo siento si algo de esto suena tonto, pero no entiendo completamente lo que está pasando y solo puedo describirlo con mi sólido conocimiento a medias.

Así que aquí va. Cuando se cargan las bibliotecas nativas requeridas, se obtienen los identificadores de la biblioteca y todas las llamadas de método requeridas. Esto parece tener éxito para Leptonica, sin embargo, para Tesseract falla.

Aquí está la salida de seguimiento antes de que se bloquee:

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.

Mirando TessBaseAPIProcessPage, se asigna a BaseAPIProcessPage en BaseApi.cs así:

[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);

Ahora sospecho que la referencia de pix es la culpable. Es el segundo parámetro (No se puede clasificar el 'parámetro n.º 2': combinación de tipo administrado/no administrado no válida (no se admite la clasificación hacia y desde los punteros de la interfaz COM).) Además, parece que esas funciones se cargan en orden de aparición en BaseApi.cs . Esa referencia de pix es la primera aparición de una clase no trivial (por ejemplo, no es un tipo base, no es una enumeración) de esas llamadas. ¿Tiene sentido?

¿Podría ser un error en .NET Core en Unix?

Tengo el mismo problema en Fedora28.

Estimado HelGeL, ¿podría proporcionar también cómo obtuvo la salida de Trace? No he podido averiguar qué debo hacer para ver el rastro.

Bueno, mi código comenzó a funcionar después de comentar la declaración BaseAPIProcessPage.

¡Gracias por la información stdcall! También probé eso y ahora el código funciona en Unix.

Por cierto, pude leer la salida de Trace simplemente colocando Console.WriteLines en Logger.cs.

Sí, gracias por la información. Veré por qué falla esa llamada y veré si
Podemos obtener una compilación de Linux juntos.

El martes 4 de septiembre de 2018 a las 03:16 HelgeL, [email protected] escribió:

¡Gracias por la información stdcall! También probé eso y ahora el código funciona en Unix.

Por cierto, pude leer la salida de Trace simplemente colocando Console.WriteLines en
Registrador.cs.


Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/charlesw/tesseract/issues/433#issuecomment-418164476 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AAPzyLRHCIWPj2YBMNtB06uLVJspp_ipks5uXWQFgaJpZM4VoNQB
.

Probablemente el mismo problema. Recibo este error en Ubuntu 16.04., (ASP).NET Core, Tesseract 4
System.DllNotFoundException: Failed to find library "liblept1760.so" for platform x64.

Hice el paquete nuget para la versión 4.0 tesseract con API fija. Probado en CentOS 7.
Génesis.Tesseract4

¿Fue útil esta página
0 / 5 - 0 calificaciones