Tesseract: COMインターフェイスポインタとの間のマーシャリングはサポートされていません(.netコア2.1)

作成日 2018年07月31日  ·  9コメント  ·  ソース: charlesw/tesseract

centos764ビット.netコア2.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)で
InteropRuntimeImplementer.TessApiSignaturesInstance.TessApiSignaturesImplementation..ctor(LibraryLoaderローダー)で
---内部例外スタックトレースの終わり---
System.RuntimeMethodHandle.InvokeMethod(Object target、Object [] arguments、Signature sig、Booleanコンストラクター、Boolean wrapExceptions)で
System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr、バインダーバインダー、Object []パラメーター、CultureInfoカルチャ)で
System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr、バインダーバインダー、Object [] args、CultureInfoカルチャー、Object [] ActivationAttributes)で
InteropDotNet.InteropRuntimeImplementer.CreateInstanceT
Tesseract.Interop.TessApi.Initialize()で
Tesseract.Interop.TessApi.get_Native()で
Tesseract.TesseractEngine..ctor(String datapath、String language、EngineMode engineMode、IEnumerable 1 configFiles, IDictionary 2 initialOptions、Boolean setOnlyNonDebugVariables)で
TesseractCore.Program.Main(String [] args)で

全てのコメント9件

まず、これは素晴らしい作品であり、超高品質のライブラリです。

また、.NETCoreを使用してLinuxでこれを実行することにも非常に興味があります。 どうやら私は同じエラーメッセージを受け取っているようですが、そこまで到達するには、いじくり回さなければなりませんでした。

1)機能ブランチ321-Tesseract-4からこれを試しています。 私のテスト環境は、.NETCore2.1を搭載したUbuntu18.04x64です。
2)次の質問は、Tesseract.dllラッパーにネイティブのtesseractライブラリを提供する方法でした。 そのため、具体的に名前が付けられたライブラリファイルを要求されないようにするために、

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

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

その結果、Ubuntuが提供するlibtesseract.soを受け入れます。
3)HighSierraを実行しているMacでもこれを試しました。 ソースから構築されたTesseract(4.0.0ベータ3)。 UnixLibraryLoaderLogic.csで.so拡張子を.dylibに変更した後(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を見ると、次のようにBaseApi.csのBaseAPIProcessPageにマップされます。

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

今、私はそのpix参照が原因であると思うでしょう。 これは2番目のパラメーターです(「パラメーター#2」をマーシャリングできません:無効なマネージド/アンマネージドタイプの組み合わせ(COMインターフェイスポインターとの間のマーシャリングはサポートされていません))さらに、これらの関数はBaseApi.csに表示される順序で読み込まれるようです。 。 そのpix参照は、これらの呼び出しの重要なクラス(たとえば、基本型ではなく、列挙型ではない)の最初の出現です。 それは理にかなっていますか?

Unix上の.NETCoreのバグでしょうか?

Fedora28でも同じ問題があります。

親愛なるHelGeL、トレース出力をどのように取得したかについても教えてください。 トレースを表示するために何をすべきか理解できませんでした。

さて、私のコードはBaseAPIProcessPage宣言にコメントした後に機能し始めました。

情報stdcallをありがとう! 私もそれを試しましたが、コードはUnixで動作します。

ところで、Logger.csにConsole.WriteLinesを配置するだけで、トレース出力を読み取ることができました。

はい、情報をありがとうございます。なぜその呼び出しが失敗するのかを見て、
Linuxビルドを一緒に取得できます。

2018年9月4日火曜日、03:16 HelgeL、 notifications @github.comは次のように書いています。

情報stdcallをありがとう! 私もそれを試しましたが、コードはUnixで動作します。

ところで、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、Tesseract4でこのエラーが発生します
System.DllNotFoundException: Failed to find library "liblept1760.so" for platform x64.

固定APIを使用して4.0tesseractバージョンのnugetパッケージを作成しました。 CentOS7でテスト済み。
Genesis.Tesseract4

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

badre429 picture badre429  ·  33コメント

hh23485 picture hh23485  ·  12コメント

nguyenq picture nguyenq  ·  25コメント

Jonathan-JFR picture Jonathan-JFR  ·  5コメント

chrishaly picture chrishaly  ·  11コメント