2009-09-15 28 views
0

我運行以下之情況:爲什麼.NET不能在內部清除錯誤?

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輸出)? Bascially打開一個文件來追加不影響Marshal.GetLastWin32Error();輸出。

+0

我真的不明白你的問題:代碼是由多個線程同時運行嗎?文件是否由其他應用程序打開?或者文件可能不存在? – 2009-09-16 07:12:02

+0

代碼在線程上運行。文件句柄在主線程中打開並傳遞到正在運行的線程中(並在調用WriteFile之前檢查它是否有效)CreateFile調用正常工作(返回一個句柄,而不是InValid)但是對WriteFile的調用失敗錯誤ERROR_ALREADY_EXISTS – SwDevMan81 2009-09-16 11:19:51

回答

0

我確定使用Marshal.GetLastWin32Error進行調試並不是最好的選擇。

0

Marshal.GetLastWin32Error()應該是你在Win32API.WriteFile()調用之後做的第一件事。不要做其他事情,例如WriteFile()和GetLastWin32Error()調用之間的任何日誌記錄等。

0

在DllImport聲明中使用SetLastError = True。

+0

我有以下所有外部操作:[DllImport(「kernel32.dll」,SetLastError = true,CharSet = CharSet.Auto)] – SwDevMan81 2009-09-16 15:29:35

相關問題