0

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

当我将其升级到 .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);

任何帮助表示赞赏。

4

2 回答 2

0

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

于 2013-09-30T06:29:17.207 回答
0

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

于 2013-01-17T19:35:58.447 回答