Windows服务启动失败

时间:2017-03-17 10:17:13

标签: c# windows-services

当我调试我的代码时,会弹出一个Windows服务启动失败的对话框 - 无法从命令行和调试器启动服务。首先必须安装Windows服务(使用installutil.exe),然后使用server explorer,Windows服务管理工具或net start命令启动。

但我已经安装了我的服务。以下是来自 cmd with admin rights。

的脚本
C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\WindowsService1\WindowsSe
rvice1\bin\Debug>installutil  WindowsService1.exe
Microsoft (R) .NET Framework Installation utility Version 4.0.30319.33440
Copyright (C) Microsoft Corporation.  All rights reserved.


Running a transacted installation.

Beginning the Install phase of the installation.
See the contents of the log file for the C:\Users\Sapuser\Documents\Visual Studi
o 2013\Projects\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe as
sembly's progress.
The file is located at C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\Wi
ndowsService1\WindowsService1\bin\Debug\WindowsService1.InstallLog.
Installing assembly 'C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\Wind
owsService1\WindowsService1\bin\Debug\WindowsService1.exe'.
Affected parameters are:
   logtoconsole =
   logfile = C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\WindowsServi
ce1\WindowsService1\bin\Debug\WindowsService1.InstallLog
   assemblypath = C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\Windows
Service1\WindowsService1\bin\Debug\WindowsService1.exe
Installing service MyTestWinService...
Service MyTestWinService has been successfully installed.
Creating EventLog source MyTestWinService in log Application...

The Install phase completed successfully, and the Commit phase is beginning.
See the contents of the log file for the C:\Users\Sapuser\Documents\Visual Studi
o 2013\Projects\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe as
sembly's progress.
The file is located at C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\Wi
ndowsService1\WindowsService1\bin\Debug\WindowsService1.InstallLog.
Committing assembly 'C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\Wind
owsService1\WindowsService1\bin\Debug\WindowsService1.exe'.
Affected parameters are:
   logtoconsole =
   logfile = C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\WindowsServi
ce1\WindowsService1\bin\Debug\WindowsService1.InstallLog
   assemblypath = C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\Windows
Service1\WindowsService1\bin\Debug\WindowsService1.exe

The Commit phase completed successfully.

The transacted install has completed.

C:\Users\Sapuser\Documents\Visual Studio 2013\Projects\WindowsService1\WindowsSe
rvice1\bin\Debug>net start MyTestWinService
The MyTestWinService service is starting.
The MyTestWinService service was started successfully.

我附上了我的代码:

public partial class Service1 : ServiceBase
    {
        private Timer timer1 = null;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            timer1 = new Timer();
            this.timer1.Interval = 60000; //60 sec
            this.timer1.Elapsed +=new System.Timers.ElapsedEventHandler(this.timer1_Tick);
            timer1.Enabled=true;
            Library.WriteErrorLog("test windows service started");

        }

        protected override void OnStop()
        {
            timer1.Enabled = false;
            Library.WriteErrorLog("Test Service ended");
        }

        public void timer1_Tick(object sender, ElapsedEventArgs e)
        {
            //job
            var result = RunProcess(@"c:\", "webupknvp.Bat", "", false);
            if (result == 0)
            {
                // success
                Console.WriteLine("Sucess");
            }
            else
            {
                // failed ErrorLevel / app ExitCode
                Console.WriteLine("failed try again");

            }


        }

        public int RunProcess(string workDir, string appName, string args, bool hide = false)
            {

                    Process proc = null;
                    proc = new Process();          
                    string batrun = string.Format("cmd.exe", "/c" + @"C:\Abhay\batfile"); // or @"C:\Abhay\batfile" in the end ("cmd.exe", "/c" + @"C:\Abhay\batfile")
                    proc.StartInfo.UseShellExecute = false;   //addition    
                    proc.StartInfo.WorkingDirectory = workDir;//batrun
                    proc.StartInfo.FileName = appName;
                    proc.StartInfo.Arguments = args;
                    proc.StartInfo.CreateNoWindow = hide;

                    proc.Start();
                    proc.WaitForExit();

                    return proc.ExitCode;
               }
    }
}

图书馆类

public static void WriteErrorLog(Exception ex)
        {
            StreamWriter sw = null;
            try
            {
                sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\ Logfile.txt", true);
                sw.WriteLine(DateTime.Now.ToString() + ":" + ex.Source.ToString().Trim() + ";" + ex.Message.ToString().Trim());
                sw.Flush();
                sw.Close();

            }
            catch
            {

            }
        }

        public static void WriteErrorLog(string Message)
        {
            StreamWriter sw = null;
            try
            { 

                sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\ Logfile.txt", true);
                sw.WriteLine(DateTime.Now.ToString() + ":" + Message);
                sw.Flush();
                sw.Close();
            }
            catch
            {

            }
        }
    }
}

Program.cs

static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service1() 
            };
            ServiceBase.Run(ServicesToRun);

        }

我应该改变什么?

1 个答案:

答案 0 :(得分:2)

您的主要功能不允许调试。除了发布版本之外,您可以创建一个可调试版本(请注意,您只能调试调试版本,并且您将无法将调试版本作为服务安装!),如下所示:

    private static void Main(string[] _arguments)
    {
        // ... some general code here
        StartDebug(_arguments);
        StartRelease();
    }

    [Conditional("DEBUG")]
    private static void StartDebug(string[] _arguments)
    {
        MessageBox.Show("Starting in debug mode");

        try
        {
            Service1 service = new Service1();
            service.Start(_arguments);
            while (true)
            {
                Thread.Sleep(100);
            }
        }
        catch (Exception ex)
        {
            Logger.LogException(ex);
        }            
    }

    [Conditional("RELEASE")]
    private static void StartRelease()
    {
        ServiceBase[] servicesToRun = { new Service1() };
        ServiceBase.Run(servicesToRun);
    }

请注意,您的Service1应该采用internal Start方法。

编辑:

目前,您覆盖了OnStart。改变如下:

    protected override void OnStart(string[] args)
    {
        Start(args);
    }

    internal void Start(string[] args)
    {
        timer1 = new Timer();
        this.timer1.Interval = 60000; //60 sec
        this.timer1.Elapsed +=new System.Timers.ElapsedEventHandler(this.timer1_Tick);
        timer1.Enabled=true;
        Library.WriteErrorLog("test windows service started");
    }
相关问题