gpt4 book ai didi

c# - 在 VS 中从 C# 调用 C++ DLL 失败。在 VS 外运行 exe,它可以工作

转载 作者:行者123 更新时间:2023-11-30 02:59:20 25 4
gpt4 key购买 nike

我有一个从 C# 控制台应用程序调用的 C++ DLL,如下所示。

当在 Visual Studio 中运行调试它时,它会抛出一个异常,提示堆栈不稳定并检查方法参数是否正确。但是,如果我在 VS 外部从 Windows 资源管理器运行 *.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();
}

最佳答案

首先,确保您在 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 ) ;

您还可以通过手动将编译器选项从/Gd 更改为/Gz 或使用“项目属性”对话框,将 __stdcall 设置为 C++ DLL 中未标记函数的默认调用约定: changing the default calling convention in Visual Studio

但如果您真的想要禁用 MDA,您可以转到“调试”->“异常”并取消选中“托管调试协助”。

您可以阅读有关 pInvokeStackImbalance 和 MDA 的更多信息 herehere .

关于c# - 在 VS 中从 C# 调用 C++ DLL 失败。在 VS 外运行 exe,它可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12971477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com