从c#访问c ++ dll库

时间:2013-01-07 10:16:42

标签: c# c++ pinvoke

  

可能重复:
  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);

但他们都给出了以下错误: "Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'C:\Users\....\myproject\bin\Debug\myproj.vshost.exe'.

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

请指导我应该做些什么。

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

这可能只是一个字符集不匹配试试这个

[DllImport("mydll.dll", CharSet = CharSet.Ansi)]
public static extern int SendText([MarshalAs(UnmanagedType.LPStr)] string var1);

尼克来自:

DLL import char * pointer from C#