2017-03-17 16 views
0

私のコードをデバッグすると、Windowsサービスの起動に失敗するダイアログボックスが表示されます。コマンドラインとデバッガからサービスを開始できません。 Windowsサービスを最初にインストールし(installutil.exeを使用して)、サーバーエクスプローラ、Windowsサービス管理ツールまたはnet startコマンドを使用して起動する必要があります。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 Studioのことですか? Visual Studioからサービスを実行してデバッグすることはできません。あなたが投稿した内容によると、あなたはサービスをインストールして実行しています(サービスウィンドウに表示されるはずです)。しかし、それはインストールされたバージョンです。 VSは引き続きIDE経由でサービスを実行することができません。 – Lithium

+0

@Lithium私はサービスウィンドウでサービスを見ることができますし、admin cmdからのネットスタートも開始しています。一方、サービスは正味の開始から始まっているが、バッチファイルを実行しているジョブはそのサービスによって完了していない。 –

答えて

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

私のサービスには内部起動メソッドがありません。これはサービスを作成する初めての方法なので、内部開始メソッドが何であるかはわかりません。 –

+0

@AbhaySinghaniaは答えを編集しました。そこに例があります –

+0

ありがとう@BernhardHiller –

関連する問題