windows服务启动失败

问题描述:

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

但我已经安装了我的服务。以下是带有管理员权限的cmd的脚本。

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

     } 

我应该改变什么?

+0

通过'调试我的代码'你的意思是从视觉工作室?您无法从Visual Studios运行服务来进行调试。根据你发布的内容,你安装了服务并且正在运行(你应该在服务窗口中看到它)。但是,这是已安装的版本; VS仍然无法通过IDE运行服务。 – Lithium

+0

@Lithium是我能够在服务窗口中看到服务,并且它也是从admin cmd启动net start。另一方面,即使服务从网络启动开始,但作业(即运行批处理文件)不会由该服务完成。 –

您的主要功能不允许进行调试。您可以创建除了发行版本调试的版本(注意,您可以只调试调试版本,您将无法安装调试版本的服务!)如下:

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"); 
    } 
+0

我的服务没有内部启动方法。这是我第一次创建服务,所以我不知道什么是内部启动方法。 –

+0

@AbhaySinghania编辑答案,看看那里的例子 –

+0

谢谢@BernhardHiller –