【发布时间】:2010-06-08 16:35:18
【问题描述】:
我必须从我的 C# 程序中调用 C++ DLL。 我正在尝试使用 PInvoke 执行此操作 - 在 VS2005\2008 中一切正常,但在迁移到 VS 2010 后,我得到了这个异常:
检测到 PInvokeStackImbalance 消息:调用 PInvoke 函数 “sampleFunc”使堆栈不平衡。 这可能是因为托管 PInvoke 签名与 非托管目标签名。检查 调用约定和参数 PInvoke 签名的匹配 目标非托管签名。
这是最初的 C++ 原型:
typedef struct {
unsigned short field1;
unsigned short field2;
} sInfo;
_declspec(dllexport) int sampleFunc(sInfo *info, char *txt);
这里是 C# 代码:
[StructLayout(LayoutKind.Sequential)]
struct SInfo
{
//[MarshalAs(UnmanagedType.U1)] //also tried with the MarshalAs attr. Didn't help.
public ushort field1;
//[MarshalAs(UnmanagedType.U1)]
public ushort field2;
};
[DllImport("sampleModule.dll", CharSet=CharSet.Ansi)]
public static extern int sampleFunc(ref SInfo info, [MarshalAs(UnmanagedType.LPStr)] string txt);
我也尝试过使用 IntPtr 而不是 ref SInfo,但得到了相同的结果...
任何帮助将不胜感激,
谢谢大家!
【问题讨论】:
标签: c# visual-studio-2010 pinvoke marshalling