.NET이 내부적으로 오류를 지우지 않는 이유는 무엇입니까?
-
07-07-2019 - |
문제
다음과 같은 장면을 실행하고 있습니다.
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);
패스는 거짓이지만 IM이 겹치기 때문에 예상됩니다.
문제는 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);
}
}
}
분명히 내부적으로 부록 텍스트 호출은 오류를 생성하는 것입니다. 이 로그 호출 후 오류를 재설정해야합니까? 나는 이것이 프레임 워크가 기능의 내부 작업에서 낮은 수준의 호출을 재설정하지 않는다는 것을 아는 데 도움이되었을 것입니다. 아, 당신은 매일 새로운 것을 배웁니다.
내가 가진 새로운 질문은이 호출 후 낮은 레벨 오류를 재설정 해야하는 것 같아요, 또는 로그 출력 (log4net과 같은 타사 도구를 사용하거나 Debug.Trace 출력을 사용하여 공상을받지 않음)을 기록하는 다른 방법이 있습니까? 기본적으로 마샬.getLastWin32error ()에 영향을 미치지 않는 추가 파일을 열기위한 어쨌든; 산출.
해결책 2
나는 사용을 결정했다 Marshal.GetLastWin32Error
디버깅이 가장 좋은 방법은 아닙니다.
다른 팁
Marshal.getLastWin32error ()는 win32api.writefile () 호출 후 가장 먼저해야 할 일이어야합니다. writefile ()와 getLastWin32error () 호출 사이에 로깅 등을 예를 들어 다른 작업을 수행하지 마십시오.
dllimport 선언에서 setlasterror = true를 사용하십시오.