2011-07-29 13 views
2

私が書いたdllに存在するいくつかのC++コードを呼び出す必要があるWPFアプリケーションを作成しています。私は、最も基本的なテスト機能を備えていても、常にPInvokeStackImbalanceエラーを表示しています。例えば、C++のdll:C#からdll関数を呼び出すときのPInvokeStackバランスの不一致

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

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

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

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

テスト(1)

を...と私はPInvokeStackImbalanceを入手します!どうすればいいの?事前に

おかげで...

トム

答えて

5

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

+0

この解決策は、同じ問題の「FORTRAN」にも当てはまります。 '!DEC $ ATTRIBUTES C :: myproc'を発行するだけです。 – ja72

2

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

extern "C" __declspec(dllexport) 
void __stdcall Test(int foo); 
関連する問題