不要在Windows Service中使用注册表

本文关键字:注册表 Service Windows | 更新日期: 2023-09-27 18:01:34

我想在我用c#编写的Windows服务中删除注册表依赖。并希望在应用程序下的事件查看器下维护事件日志。我正在使用下面的代码,这似乎不正确,因为我不想使用注册表。

在写入事件日志之前没有设置源属性。

请建议。

public Service()
{           
    try
    {
        InitializeComponent();
        if(!System.Diagnostics.EventLog.SourceExists("VWinService"))
            System.Diagnostics.EventLog.CreateEventSource("VWinService","");
        eventLog1.Source = "VWinService";
        eventLog1.Log = "";     
    }
    catch (Exception ex)
    {               
        eventLog1.WriteEntry("Error in Service Constructor.  Error message = " + ex.Message.ToString(), EventLogEntryType.Error);
    }
} 

 private void InitializeComponent()
    {       
        this.eventLog1 = new System.Diagnostics.EventLog();
        this.tmrSend = new System.Timers.Timer();
        ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).BeginInit();
        ((System.ComponentModel.ISupportInitialize)(this.tmrSend)).BeginInit();
        this.tmrSend.Elapsed += new System.Timers.ElapsedEventHandler(this.tmrSend_Elapsed);
        this.AutoLog = false;
        this.ServiceName = "VWinService";
        ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).EndInit();
        ((System.ComponentModel.ISupportInitialize)(this.tmrSend)).EndInit();
    }

不要在Windows Service中使用注册表

事件源只需要在安装时定义一次,该操作通常需要管理权限,并由安装程序执行。一旦事件源存在,您就可以仅使用源名称编写事件条目。

将一个错误写入事件日志:

EventLog eventLog = new EventLog();
eventLog.Source = "VWinService";
eventLog.WriteEntry(ex.Message, EventLogEntryType.Error, 0);

创建事件源的逻辑

if(!System.Diagnostics.EventLog.SourceExists("VWinService"))
    System.Diagnostics.EventLog.CreateEventSource("VWinService","");

属于安装程序,不需要在您的服务应用程序代码中重复。如果您使用Visual Studio向导创建了服务应用程序,那么它将在自动生成的ProjectInstaller类中为您处理。

如果你打算使用事件日志并安装你的服务,那么在Windows上必然会有注册表项。创建这些必需的注册表项是软件安装程序的责任。例如,请参阅InstallUtil,它使用ProjectInstaller类来安装服务应用程序。请确保您的客户端将理解并同意安装程序创建的注册表设置,以将您的应用程序注册为服务并使用事件日志,这些设置是正常的,并且是您的应用程序所必需的。

您应该能够完全避免为应用程序设置使用注册表。对于简单的配置值,您可以像这样在app.config中添加条目:

<configuration>
  <appSettings>
    <add key="myStringSetting" value="My string value"/>
    <add key="myNumericSetting" value="73"/>
  </appSettings>
</configuration>

您的代码将使用System.Configuration名称空间读取设置:

using System.Configuration;

你在你的代码中读取配置值,像这样:

string myString = ConfigurationManager.AppSettings["myStringSetting"];
int myNumber = Convert.ToInt32(ConfigurationManager.AppSettings["myNumericSetting"]);

如果现有注册表设置的组织要复杂得多,那么您应该创建一个Custom Configuration Section。详细说明如何做到这一点,远远超出了你原来问题的范围。请参考文档或创建一个新问题

您无法避免使用注册表,无论是用于事件日志,还是实际上用于服务本身。你误导了你的委托人您的客户应该告诉您为什么他们认为他们不想使用注册表。

如果可能的话,那么您的客户端将是世界上唯一不使用注册表的客户端。注册表是Microsoft Windows固有的一部分,并且已经存在很长时间了。毫无疑问,您的客户被错误地告知了注册表,因此他认为他想要避免它。

了解Windows服务(和事件日志)如何使用注册表,然后教育您的客户端,这将对您的客户端有最大的帮助。