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's 调用约定更改为__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 回答