【发布时间】:2019-07-07 12:30:29
【问题描述】:
我从 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 Device Interface!IO_Link_Device_Interface.IOLUSBIF20Wrapper::IOL_SetTransparentModeExt' 使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查PInvoke 签名的调用约定和参数与目标非托管签名匹配。"
在 Header 中,函数(和结构)的签名定义如下:
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 */
}
【问题讨论】:
标签: c# dll struct stack unmanaged