1

以下のように C# コンソール アプリから呼び出される C++ DLL があります。

Visual Studio で実行してデバッグすると、スタックが不安定であり、メソッドの引数が正しいことを確認するという例外がスローされます。ただし、Windows エクスプローラーから VS の外部で *.exe を実行すると、期待どおりにデータが画面に返されます。

これを Visual Studio 内で実行するにはどうすればよいですか?

ありがとう

**From the C++ header file:**
#ifdef RFIDSVRCONNECT_EXPORTS
#define RFID_CONN_API __declspec(dllexport)
#else
#define RFID_CONN_API __declspec(dllimport)
#endif

RFID_CONN_API BSTR rscListDevices( long showall ) ;


[DllImport("MyDLL.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string rscListDevices(int showall);

static void Main(string[] args)
{
  string data= rscListDevices(0);
  Console.WriteLine(data);
  Console.ReadKey();
}
4

1 に答える 1

3

まず、C++C#の両方で同じ呼び出し規約を使用していることを確認してください。

/Gdコンパイラ オプションが設定されていると思われます (デフォルトで設定されているため)。そのため__cdecl、マークされていない関数のデフォルトの呼び出し規約として使用されます。

C# コードで同じ呼び出し規約を指定することで、クラッシュを修正できます。

[DllImport("MyDLL.dll", CallingConvention=CallingConvention.Cdecl))]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string rscListDevices(int showall);

または、rscListDevicesの呼び出し規約を次のように変更__stdcallします (これは C# のデフォルトです):

RFID_CONN_API BSTR __stdcall rscListDevices( long showall ) ;

__stdcall手動でコンパイラ オプションを /Gd から /Gz に変更するか、[プロジェクト プロパティ] ダイアログを使用して、C++ DLL のマークされていない関数の既定の呼び出し規則として 設定することもできます。Visual Studio の既定の呼び出し規約を変更する

しかし、本当にMDA を無効にしたい場合は、Debug->Exceptions に移動して、Managed Debugging Assistance のチェックを外します。

pInvokeStackImbalance と MDA の詳細については、こちらこちらをご覧ください。

于 2012-10-19T09:50:33.790 に答える