对 PInvoke 函数“XX”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

对 PInvoke 函数“XX”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

原代码

[DllImport(m_FillNmame, EntryPoint = "PMSifRegister", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

修改后

 [DllImport(m_FillNmame, EntryPoint = "PMSifRegister", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]

报错原因:CallingConvention调用约定方式不对

//
    // 摘要:
    //     指定调用在非托管代码中实现的方法所需的调用约定。
    [ComVisible(true)]
    public enum CallingConvention
    {
        //
        // 摘要:
        //     此成员不是实际的调用约定,而是使用默认平台调用约定。 例如,在 Windows 上默认值是 System.Runtime.InteropServices.CallingConvention.StdCall
        //     以及它是 Windows CE.NET System.Runtime.InteropServices.CallingConvention.Cdecl。
        Winapi = 1,
        //
        // 摘要:
        //     调用方将清理堆栈。 这样,调用的函数 varargs, ,使之可用于接受个数可变的参数,如方法 Printf。
        Cdecl = 2,
        //
        // 摘要:
        //     被调用方将清理堆栈。 这是与平台调用非托管的函数调用的默认约定。
        StdCall = 3,
        //
        // 摘要:
        //     第一个参数是 this 指针并存储在 ECX 寄存器。 其他参数被推送到堆栈上。 此调用约定用于调用从非托管 DLL 导出的类的方法。
        ThisCall = 4,
        //
        // 摘要:
        //     不支持此调用约定。
        FastCall = 5
    }

你可能感兴趣的:(查问题,C#)