对PInvoke函数'ABC'的调用使堆栈失衡。

时间:2013-01-17 16:04:38

标签: pinvoke unmanaged

我有一个C#应用程序(Windows 7 vs2010上的x86 .net 3.5)调用C函数

当我将其升级到.net 4时,我收到以下消息:

这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

C签名:

BOOL ABC(UDF_HANDLE句柄,char * pQualifiedName) // #define UDF_HANDLE void *

C#方:

    [SecuritySafeCritical]
    [DllImport(dllPath, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, ThrowOnUnmappableChar = true)]
    internal static extern int ABC(
        [In] IntPtr handle,
        [MarshalAs(UnmanagedType.LPStr)] string qualifiedName);

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:0)

我将ABC第一个参数重新定义为与函数中的第一个参数相同。

答案 1 :(得分:0)

C ++代码使用cdecl调用约定。但是你已经在你的p / invoke中指定了stdcall。更改C#代码和您的两个声明将匹配。