我有一个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);
任何帮助表示感谢。
答案 0 :(得分:0)
我将ABC第一个参数重新定义为与函数中的第一个参数相同。
答案 1 :(得分:0)
C ++代码使用cdecl调用约定。但是你已经在你的p / invoke中指定了stdcall。更改C#代码和您的两个声明将匹配。