我正在运行以下场景:
SafeFileHandle handle = Win32API.CreateFile((deviceName + "\\" + pipeName),
DesiredAccess.GENERIC_WRITE | DesiredAccess.GENERIC_READ,
ShareMode.FILE_SHARE_WRITE | ShareMode.FILE_SHARE_READ,
IntPtr.Zero,
CreationDisposition.OPEN_EXISTING,
FlagsAndAttributes.FILE_ATTRIBUTE_NORMAL | FlagsAndAttributes.FILE_FLAG_OVERLAPPED,
IntPtr.Zero); // Marshal.GetLastWin32Error() returns 0 (success)
bool pass = Win32API.WriteFile(writeHandle, message.ToArray(), (uint)message.Count, ref bytes_written, ref over_lapped);
传递是假的,但是由于我正在运行重叠,所以是预期的 问题是Marshal.GetLastWin32Error()没有返回ERROR_IO_PENDING 它返回ERROR_ALREADY_EXISTS。这对我来说很奇怪,因为错误没有显示我创建文件时,但是当我写它时显示出来。现在我想弄清楚如何关闭我似乎无法访问的句柄,或至少得到一个解释为什么会发生这种情况。
编辑:好的,我已经解决了问题,我知道导致问题的原因。 private void ErrorOccurred(string detailedError)
{
lock (mLogLock)
{
try
{
System.IO.File.AppendAllText("Device" + mDeviceHandle + "Log.txt",
DateTime.Now.ToLongTimeString() + ": " + detailedError + Environment.NewLine);
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
}
显然,AppendAllText调用内部正在创建错误。此日志调用后我应该重置错误吗?我想这有助于知道框架不会在其函数的内部工作中重置低级调用。啊,你每天都学到新东西。
我想我的新问题是,我应该在此调用后重置低级别错误,还是有其他方式来记录输出(不使用第三方工具,如log4Net或使用Debug.Trace输出获得幻想) ?基本上某种程度上打开一个文件来追加不会影响Marshal.GetLastWin32Error();输出
答案 0 :(得分:0)
Marshal.GetLastWin32Error()应该是Win32API.WriteFile()调用后的第一件事。不要做任何其他事情,例如WriteFile()和GetLastWin32Error()之间的任何记录等。
答案 1 :(得分:0)
在DllImport声明中使用SetLastError = True。
答案 2 :(得分:0)
我已经确定使用Marshal.GetLastWin32Error
进行调试并不是最好的方法。