即使我正在检查,也从EventLog.CreateEventSource接收"...已经注册..."!EventLog.SourceExists

JLW*_*low 9 .net c# .net-4.0 event-log

我的以下代码失败,"...已经在本地计算机上注册为源",即使我先做检查:

lock ( eventLock )
{
    string eventLog = Constants.EventLogPL;
    string eventSrc = Constants.EventSrcPL;

    if (!EventLog.Exists(eventLog))
    {
        if (!EventLog.SourceExists(eventSrc))
        {
            try
            {
                EventLog.CreateEventSource(eventSrc, eventLog);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.Message);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我以为我的电话!EventLog.SourceExists会足以防止我的错误!我正在使用2010 .NET 4和Windows 7 64编译到任何CPU.

编辑:更新代码以获取本地常量以检查它们是否未更改,并使用锁定以确保只有一个线程可以测试和创建.代码仍然失败并出现相同的错误.

JLW*_*low 23

在深入了解Sysinternals的Process Monitor后发现了这个问题:

调用 EventLog.Exists("MyLog");

找不到日志名称,如预期的那样:

KLM \系统\ CurrentControlSet \服务\事件日志\ MyLog

调用 EventLog.SourceExists("MySource");

检查几个地方,名称未按预期找到:

HKLM\System\CurrentControlSet\services\eventlog\Application\MySource
HKLM\System\CurrentControlSet\services\eventlog\HardwareEvents\MySource
HKLM\System\CurrentControlSet\services\eventlog\Internet Explorer\MySource
HKLM\System\CurrentControlSet\services\eventlog \密钥管理服务\ MySource
HKLM\System\CurrentControlSet\services\eventlog\Media Center\MySource
HKLM\System\CurrentControlSet\services\eventlog\ODiag\MySource
HKLM\System\CurrentControlSet\services\eventlog\OSession\MySource
HKLM\System\CurrentControlSet\services\eventlog\Security\MySource
HKLM\System\CurrentControlSet\services\eventlog\System\MySource
HKLM\System\CurrentControlSet\services\eventlog\VisualSVNServer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Windows PowerShell\MySource
HKLM\System\CurrentControlSet\services\eventlog\Application\MySource
HKLM\System\CurrentControlSet\services\eventlog\HardwareEvents\MySource
HKLM\System\CurrentControlSet\services\eventlog\Internet Explorer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Key Management Service\MySource
HKLM\System\CurrentControlSet\services\eventlog\Media Center\MySource
HKLM\System\CurrentControlSet\services\eventlog\ODiag\MySource
HKLM\System\CurrentControlSet\services\eventlog\OSession\MySource
HKLM\System\CurrentControlSet\services\eventlog\Security\MySource
HKLM\System\CurrentControlSet\services\eventlog\System\MySource
HKLM\System\CurrentControlSet\services\eventlog\VisualSVNServer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Windows PowerShell\MySource
HKLM\System\CurrentControlSet\services\eventlog\MyLog

然而,打电话 EventLog.CreateEventSource("MySource", "MyLog");

在以下注册表位置和错误中查找MyLog:

HKLM \系统\ CurrentControlSet \服务\事件日志\应用程序\ MyLog

删除"HKLM\System\CurrentControlSet\services\eventlog\Application\MyLog"并重新运行修复了我的问题!

看起来好像.Exists不看所有的地方.CreateEvent呢!

  • 好吧,其实我觉得我已经解决了.最初,我设置了一个名为x的源和一个名为y的日志.随后,我将日志更改为名称x,将源更改为名称z.我收到错误,因为该类不会让我注册一个与现有事件源同名的新事件日志.为了解决这个问题,我运行了EventLog.DeleteEventSource(x); 首先,一旦过时的消息来源消失,问题就此结束. (2认同)