从框架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签名的调用约定和参数是否与目标非托管签名匹配。
答案 0 :(得分:1)
lpOverlapped
是一个指针,您应该将其声明为IntPtr
或ref
参数。
您正在运行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
);