c# - 从 C# 访问 C++ DLL 库

标签 c# c++ pinvoke

<分区>

Possible Duplicate:
pinvokestackimbalance — how can I fix this or turn it off?

我需要从 c# 代码访问一个 c++ dll 库(我没有源代码)。

例如以下函数:

UINT32 myfunc1()
UINT32 myfunc2(IN char * var1)
UINT32 myfunc3(IN char * var1, OUT UINT32 * var2)

对于 myfunc1 我使用下面的代码没有问题:

[DllImport("mydll.dll")]
public static extern int myfunc1();

另一方面,我无法使用 myfunc2 和 myfunc3。 对于 myfunc2,我尝试了以下方法:(以及许多其他人拼命尝试)

[DllImport("mydll.dll")]
public static extern int myfunc2(string var1);

[DllImport("mydll.dll")]
public static extern int myfunc2([MarshalAs(UnmanagedType.LPStr)] string var1);

[DllImport("mydll.dll")]
public static extern int myfunc2(char[] var1);

但是都报了如下错误: “托管调试助手‘PInvokeStackImbalance’在‘C:\Users\....\myproject\bin\Debug\myproj.vshost.exe’中检测到问题。

附加信息:对 PInvoke 函数 'myproject!myproject.mydll::myfunc2' 的调用使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。”

请指导我应该做什么。

最佳答案

您的 C++ 函数使用 cdecl 调用约定,但 DllImport 的默认调用约定是 stdcall。这种调用约定不匹配是堆栈不平衡 MDA 错误的最常见原因。

您通过使调用约定匹配来解决问题。最简单的方法是更改​​ C# 代码以指定 cdecl,如下所示:

[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int myfunc2(string var1);

关于c# - 从 C# 访问 C++ DLL 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14193835/

相关文章:

c++ - 正确使用 boost::wait boost::condition

c++ - 如何更改 NetBeans 模板中的时间格式

c++将 union 转换为其成员类型之一

c# - 从 C# 使用 DirectX DLL (C++)

c# - 在 C# 中实现我们自己的序列化程序 - 技巧和陷阱

c# - 我在 "Set"以下属性做错了什么?

c# - 如何使用 C# 更改 Windows 配色方案?

c# - 以类型安全的方式编码(marshal) IntPtr

c# - 编码(marshal) Win32 结构时的安全句柄 (PROCESS_INFORMATION)

c# - 将不同类型字典的重载合并到一个函数中