我有一个Windows服务项目的以下代码。 我已经成功构build并安装了它。 当我开始它,我得到事件日志中启动的事件。 但是,我从来没有得到“In Onartart”的事件为什么会这样呢?
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() { } } }
好的,这样可以解决你的问题。 如果不能看到所有的代码就很难说清楚,但是阅读一下 ,更具体地说就是“谨慎”部分。
不要使用构造函数来执行应该在OnStart中的处理。 使用OnStart处理您的服务的所有初始化。 构造函数在应用程序的可执行文件运行时调用,而不是在服务运行时调用。 该可执行文件在OnStart之前运行。 例如,当继续时,构造函数不会再被调用,因为SCM已经将对象保存在内存中。 如果OnStop释放在构造函数中而不是在OnStart中分配的资源,则在第二次调用服务时将不会再次创建所需的资源。
因此,您在构造函数中初始化事件日志所做的一切都应该移至OnStart
事件。 这将确保每次启动服务时都正确创建,这意味着您应该能够正确地记录您的OnStart
事件(在初始化之后提供)
根据@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); } }