2010-12-15 89 views
0

嘿家伙。 我有一个写入Windows事件日志的应用程序。 现在我想要相同的应用程序能够读取事件日志过程中的信息。正在从事件日志中阅读

我用我自己的dll来做我的阅读和写作。对于读取代码:

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; 

      }    
     } 
    } 

这是我用来处理事件日志

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"); 
      } 
     }     
    } 

现在,当我尝试做返回的登录一些代码中,我得到一个(ObjectDisposedException was unhandled Message=Cannot access a disposed object.)例外。 我收到异常,当我使用ev.Entries.Count

为什么我得到错误,以及处理它的最佳方法是什么?

回答

2

您正在将返回的EventLog对象置于getEventLog方法中。删除using声明。实际上,getEventLog方法可以返回null,您以后不会检查。我建议丢弃方法一起使用这个代码,而不是(在这里我也改变了你如何循环):

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

真棒。我怎么错过了?谢谢。它现在有效。 – 2010-12-15 09:42:23

0

getEventLog功能处置EventLog对象(using声明自动部署它,一旦它返回) 。

试试下面的等效代码:

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"); 
     } 
    }     
}