2012-01-17 3 views
4

Я изучаю происшествие в одном из моих приложений: я выяснил, что это связано с тем, что я подписываюсь на событие EventLog.EntryWritten, чтобы отслеживать журнал событий для событий EntryWritten. Я смотрю на класс EventLog в Reflector и следую за стеком вызовов в WinDBG, чтобы увидеть, где мое приложение терпит неудачу. Прежде всего, здесь есть выход eestack в WinDBG вокруг, где мое приложение не удается:C# Причина сбоя приложения

0632e620 74c9e900 mscorwks!StrongNameErrorInfo+0x103e4, calling mscorwks!GetMetaDataInternalInterface+0x7f70 
0632e694 74c9e855 mscorwks!StrongNameErrorInfo+0x10339, calling mscorwks+0x31c0 
0632e6a0 74215058 (MethodDesc 0x7402b7c4 +0x18 System.Security.CodeAccessPermission.RevertAssert()), calling (MethodDesc 0x740c84fc +0 System.Security.SecurityRuntime.RevertAssert(System.Threading.StackCrawlMark ByRef)) 
0632e6ac 73df4598 (MethodDesc 0x738bc65c +0xa0 System.Diagnostics.SharedUtils.CreateSafeWin32Exception(Int32)), calling (MethodDesc  0x7402b7c4 +0 System.Security.CodeAccessPermission.RevertAssert()) 
0632e6e4 73ee6fa0 (MethodDesc 0x738e064c System.Diagnostics.EventLog.get_OldestEntryNumber()), calling mscorwks!StrongNameErrorInfo+0x1031b 
0632e6f4 73df24ed (MethodDesc 0x738e06e8 +0x1bd System.Diagnostics.EventLog.CompletionCallback(System.Object)), calling (MethodDesc 0x738e064c +0 System.Diagnostics.EventLog.get_OldestEntryNumber()) 
0632e728 74bb8cef mscorwks!CoUninitializeEE+0x5687, calling mscorwks!CoUninitializeEE+0x5613 
0632e73c 73df0fe4 (MethodDesc 0x738e096c +0x94 System.Diagnostics.EventLog.StaticCompletionCallback(System.Object, Boolean)), calling 739443d4 

Примерно после этого от того, что я вижу в Отражатель здесь является частью ГЭТ аксессору для OldestEntryNumber:

if (!UnsafeNativeMethods.GetOldestEventLogRecord(this.readHandle, number)) 
{ 
    throw SharedUtils.CreateSafeWin32Exception(); 
} 

Этот Win32Exception является причиной того, что мое приложение сбой. Глядя на метод UnsafeNativeMethods.GetOldestEventLogRecord(...):

[DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)] 
public static extern bool GetOldestEventLogRecord(SafeHandle hEventLog, int[] number); 

Так что я предполагаю, моя проблема либо один из 2-х вещей:

  1. Метод GetOldestEventLogRecord(...) терпит неудачу по какой-то причине.
  2. Система не может получить/загрузить файл advapi32.dll. Может быть, поэтому я вижу StrongNameErrorInfo+0x1031b вокруг, где он может вызвать этот метод в выводе! Eestack?

Любые идеи или помощь по этому вопросу будут действительно полезны и оценены!

ответ

0

Вы - P/Invoke, кажется, ошибаетесь.

Попробуйте изменить его:

[DllImport ("advapi32.dll", SetLastError=true)] 
public static extern int GetOldestEventLogRecord (IntPtr hEventLog, ref int OldestRecord); 

Кстати, есть альтернативный способ получить эту информации: с помощью управляемых классов EventLog.

System.Diagnostics.EventLogEntryCollection 
+1

Я не могу изменить, я смотрю на этот код в отражатель, все это .NET-код, этот кусок из класса UnsafeNativeMethods в .NET. – DukeOfMarmalade

+1

@Jim Я обновил сообщение, посмотрю – WoLfulus

+0

Как вы это понимаете? Весь этот код вызывается из-за этой строки кода в моем приложении: eventLog.EntryWritten + = new EntryWrittenEventHandler (EventLogMonitor); Потому что я подписываюсь на событие EntryWritten. Таким образом, это реализация .NET, как она справляется с этим под капотом. Я не могу изменить его, я просто пытаюсь понять, почему это происходит неправильно. – DukeOfMarmalade

Смежные вопросы