0

从框架 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,它在 umanaged C++ 中是一个 unsigned long。

原始错误:

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

4

1 回答 1

1

lpOverlapped是一个指针,您应该将其声明为IntPtr,或作为ref参数。

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

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

由于您似乎没有使用重叠 I/OI,因此只需使用IntPtr并通过IntPtr.Zero.

[DllImport("kernel32.dll")]
static extern bool WriteFile(
    IntPtr hFile,
    byte[] lpBuffer,
    uint nNumberOfBytesToWrite, 
    out uint lpNumberOfBytesWritten,
    IntPtr lpOverlapped
);
于 2011-06-29T14:12:09.323 回答