为什么EventRecord.FormatDescription()返回null?

Joh*_*esH 9 .net c# event-log

当System.Diagnostics.Eventing.Reader.EventLogQuery用于从Windows事件日志中读取事件时,该EventRecord.FormatDescription()方法有时会返回null.为什么是这样?在事件查看器中,有关于返回null的事件的消息.

Joh*_*esH 23

这是由于.NET框架中的错误.

基本上你需要做的就是解决这个bug是将CurrentCulture设置为"en-US".

例:

var beforeCulture = Thread.CurrentThread.CurrentCulture;

try
{
  Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

  using (var session = new EventLogSession(ipOrAddress, userDomain, username, password, SessionAuthentication.Default))
  {
    var query = new EventLogQuery("System", PathType.LogName, queryString)
      {
        ReverseDirection = true,
        Session = session
      };

    using (var reader = new EventLogReader(query))
    {
      for (var record = reader.ReadEvent(); record != null; record = reader.ReadEvent())
      {
        // Read event records
        string message = record.FormatDescription();
      }
    }
  }
}
finally
{
  Thread.CurrentThread.CurrentCulture = beforeCulture;
}
Run Code Online (Sandbox Code Playgroud)

此解决办法是非常难找,所以我想我会记录它的地方将被谷歌索引.我在一个旧的MS Connect案例中找到了它,但它已被关闭,状态为"不会修复".

更新: 已经报告了.NET 4的错误,状态为"发送给工程团队供考虑",并发表评论,暗示可能会在下一个主要的.NET框架版本(v5)中修复该错误.

  • 在2014年的.NET 4.5上仍然存在相同的问题.但是,查看"FormatDescription"的源代码,它似乎是对[EvtFormatMessage]的本机调用(http://msdn.microsoft.com/en-us/library/windows /desktop/aa385359(v=vs.85).aspx)执行格式化.因为事件日志消息可以被本地化,所以线程的当前文化和事件源的区域设置之间可能存在一些相互作用.但是,从.NET的角度来看,行为只是令人困惑. (2认同)