尝试执行托管代码时为什么会出现PInvoceStackImbalance

时间:2019-02-13 15:47:15

标签: c# dll struct stack unmanaged

我从C#中的非托管dll调用函数。我对此dll的调用之一正在起作用。但是另一个参数具有更高级的参数,当我在C#代码中执行Funkction时:

[DllImport("IOLUSBIF20.dll", CallingConvention = CallingConvention.StdCall)]
public static extern long IOL_SetTransparentModeExt(long Handle, UInt32 Port, ref TTransparentParameters pTransparentParameters);

我收到以下错误:

  

“ PInvokeStackImbalance”:“对PInvoke函数'IO-Link设备接口!IO_Link_Device_Interface.IOLUSBIF20Wrapper :: IOL_SetTransparentModeExt'的调用已使堆栈不平衡。这很可能是因为托管的PInvoke签名与非托管的目标签名不匹配。请检查PInvoke签名的调用约定和参数与目标非托管签名匹配。”

在标头中,函数(和结构)的签名定义如下:

LONG __stdcall IOL_SetTransparentModeExt(LONG Handle, DWORD Port, TTransparentParameters * pTransparentParameters);


typedef struct TTransparentParametersStruct
{
  BYTE StartPattern[16];    /**< starting pattern */
  BYTE ReturnPattern[32];   /**< returning pattern */
} TTransparentParameters;

我作为参数传递的结构如下:

[StructLayout(LayoutKind.Sequential)]
    public struct TTransparentParameters
    {
        public Byte[] StartPattern;    /**< starting pattern */
        public Byte[] ReturnPattern;   /**< returning pattern */
    }

1 个答案:

答案 0 :(得分:2)

您的堆栈不平衡,因为不受管理的数据结构由

组成
BYTE StartPattern[16];    /**< starting pattern */
BYTE ReturnPattern[32];   /**< returning pattern */

占用48个字节,而您对这些字段的托管解释大小错误。如果您为封送拆收器指定大小,则您的堆栈应保持平衡:

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public Byte[] StartPattern;    /**< starting pattern */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public Byte[] ReturnPattern;   /**< returning pattern */