2010-12-15 15 views
0

Hey Leute. Ich habe eine App, die in das Windows-Ereignisprotokoll schreibt. Nun möchte ich die gleiche App in der Lage sein, das Ereignisprotokoll zu lesen und die darin enthaltenen Informationen zu verarbeiten.Aus einem Eventlog programmatisch lesen

Ich benutze meine eigene DLL, um mein Lesen und Schreiben zu tun. Der Code für das Lesen:

public static EventLog getEventLog(string Source, string Log) 
    { 
     using(EventLog ev = new EventLog(Log, System.Environment.MachineName, Source)) 
     { 
      if (ev.Entries.Count <= 0) 
      { 
       return null; 
      } 
      else 
      { 
       return ev; 

      }    
     } 
    } 

Hier ist der Code Ich benutze das eventlog

private void ProcessEvents() 
    { 
     using (EventLog ev = EventComms.EventComms.getEventLog("Application", "Application")) 
     { 
      for (int i = ev.Entries.Count - 1; i >= ev.Entries.Count; i--) 
      { 
       EventLogEntry CurrentEntry = ev.Entries[i]; 
       Console.WriteLine("Event ID : " + CurrentEntry.InstanceId); 
       Console.WriteLine("Entry Type : " + CurrentEntry.EntryType.ToString()); 
       Console.WriteLine("Message : " + CurrentEntry.Message + "\n"); 
      } 
     }     
    } 

Nun zu behandeln, wenn ich versuche, und etwas tun mit dem zurück Log ich eine (ObjectDisposedException was unhandled Message=Cannot access a disposed object.) Exception. Ich bekomme die Ausnahme, wenn ich ev.Entries.Count verwenden

Warum bekomme ich den Fehler, und was ist der beste Weg, damit umzugehen?

Antwort

2

Sie entsorgen das zurückgegebene EventLog Objekt in der getEventLog Methode. Entfernen Sie die using Anweisung. Tatsächlich kann die getEventLog Methode null zurückgeben, die Sie später nicht überprüfen. Ich schlage vor, das Verfahren alle zusammen fallen lassen und mit diesem Code statt (wo ich auch geändert, wie Sie Loop):

private void ProcessEvents() 
{ 
    using (EventLog ev = new EventLog("Application", System.Environment.MachineName, "Application")) 
    { 
    for (int i = ev.Entries.Count - 1; i >= 0; i--) 
    { 
     EventLogEntry CurrentEntry = ev.Entries[i]; 
     Console.WriteLine("Event ID : " + CurrentEntry.InstanceId); 
     Console.WriteLine("Entry Type : " + CurrentEntry.EntryType.ToString()); 
     Console.WriteLine("Message : " + CurrentEntry.Message + "\n"); 
    } 
    } 
} 
+0

genial. Wie habe ich das vermisst? Vielen Dank. Es funktioniert jetzt. –

0

Ihre getEventLog Funktion Entsorgung das EventLog Objekt (die using Anweisung Auto verfügt es, sobald es zurückgibt) .

Versuchen Sie, die folgenden äquivalenten Code:

private void ProcessEvents() 
{ 
    using (EventLog ev = new EventLog("Application", System.Environment.MachineName, "Application")) 
    { 
     if (ev.Entries.Count <= 0)) 
     { 
      return; 
     } 

     for (int i = ev.Entries.Count - 1; i >= ev.Entries.Count; i--) 
     { 
      EventLogEntry CurrentEntry = ev.Entries[i]; 
      Console.WriteLine("Event ID : " + CurrentEntry.InstanceId); 
      Console.WriteLine("Entry Type : " + CurrentEntry.EntryType.ToString()); 
      Console.WriteLine("Message : " + CurrentEntry.Message + "\n"); 
     } 
    }     
}