.NETが内部的にエラーをクリアしないのはなぜですか?
-
07-07-2019 - |
質問
次のscenerioを実行しています:
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);
passはfalseですが、im runningがオーバーラップしているため予期されます。
問題は、Marshal.GetLastWin32Error()がERROR_IO_PENDINGを返さないことです。
ERROR_ALREADY_EXISTSを返します。これは、ファイルを作成したときにエラーが表示されなかったが、書き込むと表示されるため、奇妙なことです。今、私はアクセスできないと思われるハンドルを閉じる方法を理解しようとしています。
編集:OK、私は問題を否定しました。問題の原因はわかっています。
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呼び出しはエラーを作成しています。このログの呼び出し後にエラーをリセットする必要がありますか?これは、フレームワークがその機能の内部動作で低レベルの呼び出しをリセットしないことを知るのに役立つと思います。ああ、あなたは毎日新しいことを学びます。
新しい質問は、この呼び出し後に低レベルのエラーをリセットする必要があるか、または出力をログに記録する他の方法がありますか? ?基本的に、Marshal.GetLastWin32Error();に影響しない追加用のファイルを開くことです。出力。
解決 2
デバッグに Marshal.GetLastWin32Error
を使用するのは最善の方法ではないと判断しました。
他のヒント
Marshal.GetLastWin32Error()は、Win32API.WriteFile()呼び出しの後に最初に行うことです。他に何もしないでください。 WriteFile()呼び出しとGetLastWin32Error()呼び出しの間のロギングなど。
DllImport宣言でSetLastError = Trueを使用します。