c# – 在安装.Net服务期间创建自定义事件日志和事件源的最可靠方法是什么

我无法在安装我的.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 });

所引用的facade方法只返回日志,服务等的名称的字符串。

这段代码大部分时间都工作,但最近安装后,我开始得到我的日志条目显示在应用程序日志,而不是自定义日志。并且以下错误也在日志中:

The description for Event ID ( 0 ) in Source ( AutoCheckout ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURCE= flag to retrieve this description; see Help and Support for details.

由于某种原因,它或者是在卸载期间没有正确删除源或者它不是在安装过程中创建它。

任何帮助的最佳做法在这里感谢。

谢谢!

此外,这里是我如何写日志的例外的示例:

// Write to Log
EventLog.WriteEntry(Facade.GetEventLogSource(), errorDetails, EventLogEntryType.Error, 99);

关于stephbu的答案:建议的路径是安装程序脚本和installutil,或Windows安装程序。

我使用一个安装项目,它执行服务的安装和设置日志。无论我使用installutil.exe或Windows安装项目我相信他们都调用相同的ProjectInstaller类我显示上面。

我看到如果日志在重新启动之前没有被真正删除,我的测试机器的状态如何可能导致错误。我将进行更多的实验,看看是否解决了这个问题。

编辑:
我有兴趣在安装服务期间注册源和日志名称的确定的方式。因此,如果服务先前已安装,它将删除源,或在后续安装期间重新使用源。

我还没有机会学习WiX尝试这条路线。

最好的建议是不要在Visual Studio中使用安装项目。它有非常严格的限制。
我有WiX非常好的结果
http://stackoverflow.com/questions/115488/what-is-the-most-reliable-way-to-create-a-custom-event-log-and-event-source-duri

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 在安装.Net服务期间创建自定义事件日志和事件源的最可靠方法是什么