2

作成したdllに存在するC++コードを呼び出す必要があるWPFアプリを作成しています。最も基本的なテスト関数を使用しても、常にPInvokeStackImbalanceエラーが発生します。たとえば、C ++ dllの場合:

extern "C" __declspec(dllexport) void Test( int foo);

この関数は何もしません。C#側は次のようになります。

    [DllImport("myDll.dll", CharSet = CharSet.Auto)]
    private static extern void Test( int foo);

そして、私はこのc#関数を次のように呼び出します:

Test(1)

...そして私はPInvokeStackImbalanceを手に入れました!! どうすればいいの?

前もって感謝します...

トム

4

2 に答える 2

4

CallingConvention.Cdeclを指定してみてください。ドキュメントに例があります。デフォルトの呼び出し規約はWinapiデスクトップ ウィンドウです。しかし、あなたの関数は として宣言されていextern Cます。

于 2011-07-29T12:58:39.187 に答える
3

[DllImport] 宣言に CallingConvention がありません。必須です。__stdcall キーワードを使用していないため、Test 関数は Cdecl です。__cdecl と __stdcall の違いは、呼び出し後にスタックがクリーンアップされる方法です。__cdecl は、Microsoft を含むほとんどの C++ コンパイラのデフォルトです。C++ 側で修正するには、次のように宣言します。

extern "C" __declspec(dllexport) 
void __stdcall Test( int foo);
于 2011-07-29T13:01:06.473 に答える