1

C# .exe プロジェクトをネイティブ Visual-C++ DLL に接続するのは初めてです。

単純な整数だけを渡す方法がわかりません。次のコードを実行すると、「PInvoke ... unbalanced the stack」に関するポップアップ エラーが発生します。

C++ DLL........

 extern "C"
 {

__declspec(dllexport) void start_frame_generation(  int& test_num )
{
    Console::WriteLine ("test_num = " + test_num );
    }

C# .................................

    [DllImport("Ultrasound_Frame_Grabber.dll")]
public static extern void start_frame_generation(  ref int test_num );

    private void VNGuideViewForm_Load(object sender, EventArgs e)
    {

            int test_num = 123;
            start_frame_generation( ref test_num);
     }
4

2 に答える 2

4

あなたのように追加する必要がありCallingConvention = CallingConvention.CdeclますDllImport

[DllImport("Ultrasound_Frame_Grabber.dll", CallingConvention = CallingConvention.Cdecl)]

この宣言を省略すると、表示されているアンバランス スタック メッセージが発生します。

VS2010 より前のコンパイラは想定CallingConvention.Cdeclしていましたが、それ以降、Win32 API のいずれかを呼び出す場合を除き、コンパイラを追加する必要がありました。

于 2013-07-11T17:59:38.440 に答える
0

pm100が正しいです。p/invoke マーシャラーに、関数が C 宣言を使用していることを伝える必要があります (デフォルトの StdCall とは対照的に)。DllImport 属性内に、次のパラメーターを追加します。 CallingConvention = CallingConvention.Cdecl

さまざまな呼び出し規則によって、関数への引数をスタックに配置する方法と、スタックのクリーンアップを担当するのは誰か (関数の呼び出し元または呼び出される関数) の両方が決まります。不適切な呼び出し規則を使用すると、関数の完了後にスタックが予想とは異なるサイズになり、このエラーが発生します。

于 2013-07-11T17:51:06.680 に答える