0

このようなC++関数があります

    __declspec(dllexport) int ___stdcall RegisterPerson(char const * const szName)
    {
        std::string copyName( szName );
        // Assign name to a google protocol buffer object
        // Psuedo code follows..
        Protobuf::Person person;
        person.set_name(copyName);
        // Error Occurs here...
        std::cerr << person->DebugString() << std::endl;
    }

対応する C# コードは次のようになります...

    [DllImport(@"MyLibrary.dll", SetLastError = true)]
    public static unsafe extern int RegisterPerson([MarshalAs(UnmanagedType.LPTStr)]string szName)

なぜこれが機能しないのかわかりません。私の C++ ライブラリは、マルチバイト エンコーディングのマルチ スレッド DLL としてコンパイルされています。

どんな助けでも大歓迎です。これはオンラインでよくある問題だと思いましたが、問題の解決策につながる回答がありません。

DLL がエクスポートしたものと同じ関数パラメーターを使用して、別のエクスポートされた関数を正常に呼び出すことができ、その関数は正常に機能しました。この「登録者」機能は、他のエクスポートされた機能よりも少し長く、何らかの理由で機能しません。

4

1 に答える 1

1

まず、C++ 関数の定義で がextern "C"見つかりません。指定されていない場合、Pinvoke は C++ の名前が混在しているため、関数を見つけることができません。

C#でのdefineとして、UnmanagedType.LPTStrを指定すると、デフォルトではワイドcharになりますが、C++関数のRegisterPersonのパラメータはcharなので、UnmanagedType.LPStrに変更する必要があります。

詳細については、MSDN ライブラリを参照してください。

于 2012-11-20T06:21:29.577 に答える