24

C++ で書かれたサードパーティ製の dll があります。dll のドキュメントからの情報を次に示します。

//start documentation

RECO_DATA{
wchar_t Surname[200];
wchar_t Firstname[200];
}

説明: 関数の結果を受け取るためのデータ構造。すべての関数の結果は Unicode (UTF-8) として保存されます。

方法:

bool recoCHN_P_Name(char *imgPath,RECO_DATA *o_data);

入力:

char * imgPath

この関数が認識する画像の場所のフルパス

RECO_DATA * o_data

関数の結果を受け取るためのデータ オブジェクト。関数の戻り値: 成功した場合は true、それ以外の場合は false が返されます。

//end documentation

C# アプリケーションから recoCHN_P_Name を呼び出そうとしています。この目的のために、私はこのコードを思いつきました:

dll をインポートするコード:

    public class cnOCRsdk
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct RECO_DATA{
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=200)]
        public string FirstName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
        public string Surname;
        }

    [DllImport(@"cnOCRsdk.dll", EntryPoint="recoCHN_P_Name")]
    public static extern bool recoCHN_P_Name(byte[] imgPath, RECO_DATA o_data);
}

関数を呼び出すコード:

            cnOCRsdk.RECO_DATA recoData = new cnOCRsdk.RECO_DATA();

        string path = @"C:\WINDOWS\twain_32\twainrgb.bmp";

        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        byte[] bytes = encoding.GetBytes(path);

        bool res = cnOCRsdk.recoCHN_P_Name(bytes, recoData);

そして、私が得ているエラーは、「DLL 'cnOCRsdk.dll' で 'recoCHN_P_Name' という名前のエントリ ポイントが見つかりません。」C++ から C# への型の変換でエラーが発生したのではないかと疑っています。正確にはどこで ... ?

4

9 に答える 9

43

まず、関数が実際にエクスポートされていることを確認してください:

Visual Studio コマンド プロンプトで、次を使用します。dumpbin /exports whatever.dll

于 2009-03-17T06:32:49.947 に答える
30

C#はC ++の名前マングリングをサポートしていないため、C++関数を次のように宣言する必要があります。

extern "C" {...}

(サードパーティからのものである場合はオプションではない可能性があります)、または機能させることができる場合は、マングルされた名前を直接呼び出します。機能へのマングルされていないインターフェースをサードパーティに提供させる方が簡単な場合があります。

于 2009-03-17T07:13:44.250 に答える
18

解決済み-少なくともプログラムが壊れず、実際にブール値を返すところまで。

重要なのは、エントリポイントを「マングル」名として指定することだったと思います。

    [DllImport(@"cnOCRsdk.dll", EntryPoint="?recoCHN_P_Name@CcnOCRsdk@@QAE_NPADPAURECO_DATA@@@Z")]
    public static extern bool recoCHN_P_Name(ref string imgPath, ref RECO_DATA o_data);

その後、他のエラーが発生しましたが、「エントリポイントが見つかりません」はなくなりました。

于 2009-03-17T23:09:25.037 に答える
4

C++/CLI を使用してラッパーを作成します。このラッパーは、.h ファイルをインクルードし、サード パーティ ベンダーから入手した .lib ファイルにリンクできます。そうすれば、C# プログラムのマネージ インターフェイスを簡単かつ安全に作成できます。

于 2009-03-17T08:08:07.207 に答える
0

DBにアクセスしたいときにこの問題が発生し、EFコアをEF 6.4.4に変更することで解決しました。このような問題があり、EFのバージョンを変更またはダウングレードする必要がある可能性があります(EFを使用している場合)

于 2020-06-14T08:10:04.490 に答える