不想在Windows服务中使用注册表

时间:2014-05-02 14:09:13

标签: c# windows

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

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

请建议。

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();
    }

2 个答案:

答案 0 :(得分:1)

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

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

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上必然会有注册表项。创建这些必需的注册表项是软件安装程序的责任。例如,请参阅使用ProjectInstaller类安装服务应用程序的InstallUtil。请放心,您的客户将理解并同意安装程序创建的注册表设置将您的应用程序注册为服务并使用事件日志是正常的并且是您的应用程序所必需的。

您应该能够完全避免使用注册表进行应用程序设置。对于简单的配置值,您可以在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。详细描述如何执行此操作远远超出了原始问题的范围。请参阅文档或创建新问题。

答案 1 :(得分:0)

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

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

通过了解Windows服务(和事件日志)如何使用注册表,然后向您的客户了解相关信息,您将为您的客户提供最大的帮助。