未在Windows服务中获取OnStart事件日志条目

时间:2012-10-09 11:51:29

标签: c# windows service

我有一个Windows服务项目的代码。我已成功构建并安装它。当我启动它时,我在事件日志中启动了一个事件。但是,我从来没有得到“In Onstart”的事件,为什么会这样呢?

namespace ADServiceCarlos
{
    public partial class ADServiceCarlos : ServiceBase
    {           
        public ADServiceCarlos()
        {
            InitializeComponent();
            this.AutoLog = true;

            if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
            {         
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource","MyNewLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyNewLog";
        }

        protected override void OnStart(string[] args)
        {
            eventLog1.WriteEntry("In OnStart");
        }

        protected override void OnStop()
        {
        }
    }
}

2 个答案:

答案 0 :(得分:4)

好的,这可能会解决您的问题。如果没有能够看到你的所有代码,很难说清楚,但read this - 更具体地说是“警告”部分。

  

不要使用构造函数来执行应该处理的处理   的OnStart。使用OnStart处理服务的所有初始化。该   构造函数在应用程序的可执行文件运行时调用,而不是在何时运行   服务运行。可执行文件在OnStart之前运行。当你   继续,例如,因为没有再次调用构造函数   SCM已将对象保存在内存中。如果OnStop发布资源   在构造函数中而不是在OnStart中分配所需的   第二次服务时不会再创建资源   调用。

因此,您在构造函数中初始化事件日志所做的一切都应移至OnStart事件。这将确保每次服务启动时都能正确创建,这意味着您应该能够正确记录OnStart事件(假设您在初始化后执行此操作)

答案 1 :(得分:1)

基于@musefan发布的内容,这是一个例子。我必须完全将所有内容移出构造函数。

public class ServiceMain : System.ServiceProcess.ServiceBase
    {
        public const string SERVICE_NAME = "ServiceName";

        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public ServiceMain()
        {
            // This call is required by the Windows.Forms Component Designer.
            InitializeComponent();
        }

        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            this.ServiceName = SERVICE_NAME;
            this.CanPauseAndContinue = true;
        }

        static void Main()
        {
            //Log all unhandled exceptions
            AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
            System.ServiceProcess.ServiceBase[] ServicesToRun;
            ServicesToRun = new System.ServiceProcess.ServiceBase[] { new ServiceMain() };
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                    components.Dispose();
            }
            base.Dispose(disposing);
        }

        /// <summary>
        /// Set things in motion so your service can do its work.
        /// </summary>
        protected override void OnStart(string[] args)
        {
            //Do your stuff here
        }

        static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
        {
            Environment.Exit(1);
        }
}