0

私は、C# で実行する必要がある C++ コードの作成に 1 日を費やしています。このDLL チュートリアルを実行しましたが、C# アプリで使用する際に問題が発生しました。以下にすべてのコードを掲載します。

このPInvokeStackImbalanceエラーが発生しています:「PInvoke 関数 'frmVideo::Add' の呼び出しにより、スタックのバランスが崩れました。これは、マネージド PInvoke 署名がアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。PInvoke シグネチャの呼び出し規約とパラメーターがターゲットのアンマネージド シグネチャと一致することを確認してください。

いつもありがとう、ケビン

DLLTutorial.h

#ifndef _DLL_TUTORIAL_H_
#define _DLL_TUTORIAL_H_
#include <iostream>

#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif

extern "C"
{
   DECLDIR int Add( int a, int b );
   DECLDIR void Function( void );
}

#endif

DLLTutorial.cpp

#include <iostream>

#define DLL_EXPORT

#include "DLLTutorial.h"


extern "C"
{
   DECLDIR int Add( int a, int b )
   {
      return( a + b );
   }

   DECLDIR void Function( void )
   {
      std::cout << "DLL Called!" << std::endl;
   }
}

DLL を使用する C# コード:

using System.Runtime.InteropServices;
[DllImport(@"C:\Users\kpenner\Desktop\DllTutorialProj.dll"]
public static extern int Add(int x, int y);
int x = 5;
int y = 10;
int z = Add(x, y);
4

1 に答える 1

5

C++ コードはcdecl呼び出し規約を使用し、C# コードのデフォルトはstdcallです。この不一致により、表示されるメッセージが説明されます。

インターフェイスの両側を一致させます。

[DllImport(@"...", CallingConvention=CallingConvention.Cdecl]
public static extern int Add(int x, int y);

stdcallまたは、C++ エクスポートに使用できます。

DECLDIR __stdcall int Add( int a, int b );

これら 2 つのオプションのどちらを選択するかはあなた次第ですが、明らかな理由から、インターフェイスの片側のみを変更し、両方を変更しないようにしてください。

于 2012-05-22T19:30:33.657 に答える