在安装 .Net Windows 服务期间,我难以可靠地创建/删除事件源。
这是我的 ProjectInstaller 类的代码:
// Create Process Installer
ServiceProcessInstaller spi = new ServiceProcessInstaller();
spi.Account = ServiceAccount.LocalSystem;
// Create Service
ServiceInstaller si = new ServiceInstaller();
si.ServiceName = Facade.GetServiceName();
si.Description = "Processes ...";
si.DisplayName = "Auto Checkout";
si.StartType = ServiceStartMode.Automatic;
// Remove Event Source if already there
if (EventLog.SourceExists("AutoCheckout"))
EventLog.DeleteEventSource("AutoCheckout");
// Create Event Source and Event Log
EventLogInstaller log = new EventLogInstaller();
log.Source = "AutoCheckout";
log.Log = "AutoCheckoutLog";
Installers.AddRange(new Installer[] { spi, si, log });
引用的外观方法只返回日志、服务等名称的字符串。
此代码大部分时间都有效,但最近在安装后,我开始让我的日志条目显示在应用程序日志中,而不是自定义日志中。日志中还有以下错误:
找不到源 (AutoCheckout) 中事件 ID (0) 的描述。本地计算机可能没有必要的注册表信息或消息 DLL 文件来显示来自远程计算机的消息。您可以使用 /AUXSOURCE= 标志来检索此描述;有关详细信息,请参阅帮助和支持。
由于某种原因,它要么在卸载期间没有正确删除源,要么在安装期间没有创建它。
感谢您对此处最佳实践的任何帮助。
谢谢!
此外,这是我如何将异常写入日志的示例:
// Write to Log
EventLog.WriteEntry(Facade.GetEventLogSource(), errorDetails, EventLogEntryType.Error, 99);
关于 stephbu 的回答:推荐的路径是安装程序脚本和 installutil,或 Windows 安装程序。
我正在使用一个安装项目,它执行服务的安装并设置日志。无论我使用 installutil.exe 还是 windows 安装项目,我相信它们都调用了我上面显示的相同的 ProjectInstaller 类。
如果在重新启动之前没有真正删除日志,我会看到我的测试机器的状态如何导致错误。我将进行更多实验,看看是否能解决问题。
编辑: 我对在安装服务期间注册源和日志名称的可靠方式感兴趣。因此,如果该服务之前已安装,它将删除源,或在后续安装期间重用源。
我还没有机会学习 WiX 来尝试这条路线。