c# - 当我尝试执行非托管代码时,为什么会得到 PInvoceStackImbalance
问题描述
我正在从 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 */
}
解决方案
您的堆栈不平衡,因为非托管数据结构由
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 */
推荐阅读
- acumatica - Acumatica。我们如何将自己的图标添加到现代 UI?
- typescript - 如何扩展@types/express 请求接口?
- razor - 使用 RazorEngine 创建纯文本模板
- mongodb - 无法与 MongoDB 连接
- hibernate - Grails 升级到 3.3.x:无法使用 grails 3.3.5 访问 persistentEntity.relationshipMap 和 persistentEntity.hasOneMap
- javascript - CefSharp offscreen with .net core 2.0 Runtime Error , System.IO.FileNotFoundException: 'Could not load file or assembly 'CefSharp.Core,
- ruby-on-rails - 来自实时站点的令人兴奋的数据添加到 pgAdmin
- ruby-on-rails - 在 JRuby 中使用 Java 的 MessageDigest 类
- html - Material-ui 1.3 fontsize 不响应屏幕宽度?
- java - 如何修复 CWE-470:使用外部控制输入来选择类或代码(“不安全反射”)