在WriteFile kernel32.dll上检测到PInvokeStackImbalance

时间:2011-06-29 14:06:38

标签: c# pinvoke kernel32 writefile

从框架2迁移到框架4后,运行WriteFile函数时出错。

[DllImport("kernel32.dll")]
        public static extern bool WriteFile(SafeHandle hFile,
            byte[] lpBuffer, 
            uint nNumberOfBytesToWrite, 
            out uint lpNumberOfBytesWritten, 
           long lpOverlapped);

解决方案:

 [DllImport("kernel32.dll")]
        public static extern bool WriteFile(SafeHandle hFile, 
            byte[] lpBuffer, 
            uint nNumberOfBytesToWrite, 
            out uint lpNumberOfBytesWritten, 
           **Int32** lpOverlapped);

lpOverlapped参数应该是int32,这是一个unsigned long in umanaged C ++。

原始错误:

检测到PInvokeStackImbalance 消息:对PInvoke函数的调用''使堆栈失去平衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

1 个答案:

答案 0 :(得分:1)

lpOverlapped是一个指针,您应该将其声明为IntPtrref参数。

您正在运行32位进程,并且在预期指针时,以前传递64位整数long。较新版本的.net运行时检测到错误。

解决方案绝对不是将参数声明为Int32。如果您编译为64位目标,那将是错误的。

由于您似乎没有使用重叠I / O,我只会使用IntPtr并传递IntPtr.Zero

[DllImport("kernel32.dll")]
static extern bool WriteFile(
    IntPtr hFile,
    byte[] lpBuffer,
    uint nNumberOfBytesToWrite, 
    out uint lpNumberOfBytesWritten,
    IntPtr lpOverlapped
);
相关问题