Почему .NET внутренне не очищает ошибки? - PullRequest
0 голосов
/ 16 сентября 2009

Я управляю следующим 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, но этого и следовало ожидать, так как я работаю с перекрытием.
Проблема в 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 (); выход.

Ответы [ 3 ]

0 голосов
/ 16 сентября 2009

Используйте SetLastError = True в объявлении DllImport.

0 голосов
/ 05 января 2011

Я решил, что использование Marshal.GetLastWin32Error для отладки - не лучший способ.

0 голосов
/ 16 сентября 2009

Marshal.GetLastWin32Error () должно быть самым первым, что вы делаете после вызова Win32API.WriteFile (). Больше ничего не делай, например любое ведение журнала и т. д. между вызовами WriteFile () и GetLastWin32Error ().

...