2011-03-01 3 views
21

として、私は、Windowsのサービスをデバッグしたいが、それは実行Windowsサービスコンソールアプリケーション

を言って、エラーメッセージをポップには、コマンドライン やデバッガからサービスを開始できません。 Windowsサービス は、 installutil.exeを使用してインストールし、サーバエクスプローラ 、Windowsサービス 管理ツールまたはNET コマンドを開始する必要があります。

Windowsサービスを実行する前に、私は本当に

enter image description here

+4

に説明したものの一つですが(http://stackoverflow.com/questions/5156427/how-do-you-debug [ちょうどこのような記事を見ました] -a-windows-service) –

答えて

32

.....このエラーについてどんな考えを持っていない、それは最初ます。installutilを使用して「インストール」する必要があります。 EG:

C:\installutil -i c:\path\to\project\debug\service.exe 

次に、サービスの一覧を開いて起動することができます。 EG:

  1. 右「マイコンピュータ」をクリックし
  2. クリッククリック
  3. 「サービスとアプリケーション」を開き
  4. 「管理」に関する「サービス」
  5. のリストであなたのサービスを検索し、その上で
  6. クリックを右クリックして「スタート」

それが起動したら、あなたはビジュアルスチューに行くことができますdio、 'Debug'をクリックし、 'Attach to Process'をクリックします。

別の技術は、サービスであなたのOnStart()メソッドに次の行を追加することです:あなたがいることを行うと

System.Diagnostics.Debugger.Launch(); 

、それは、サービスをデバッグするためのVisual Studioのインスタンスを選択するプロンプトを表示します。

+1

「OnCommitted」メソッドで次のようにインストーラを作成すると、美しく動作します: '(ServiceController sc = new ServiceController(__ SERVICENAME __)){sc.Start();}' (または、説明どおりに手動で開始することもできます)。 –

+1

申し訳ありませんが、私はこれを行うことができません。C:\ path \ to \ project \ debug \ service.exe – pinki

+0

manasareddy、あなたは試してみるとどうなりますか? –

13

(それは生産のサービスとして実行されたときに)あなたはDEBUGモード(通常はVisual Studioの内部に必ずしも必要ではないが)、またはRELEASEモードにいるかどうかに基づいて、アセンブリの起動モードを変更することができます。

変更し、この:

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

と:

static class Program 
{ 
    static void Main() 
    { 
     #if(!DEBUG) 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new MyService() 
      }; 
      ServiceBase.Run(ServicesToRun); 
     #else 
      MyService myServ = new MyService(); 
      myServ.Process(); 
      // here Process is my Service function 
      // that will run when my service onstart is call 
      // you need to call your own method or function name here instead of Process(); 
     #endif 
    } 
} 

技術this articleから採取したクレジットは、記事の著者、Tejas Vaishnavためです。私はここでコードフラグメントをコピーしました。なぜなら、SOはしばらくの間消えるかもしれないリンクよりも完全な答えを好むからです。

+0

これはちょうどmyServ.Process()を実行して終了しますか? –

+0

基本的にそれを忙しくするのはあなたの責任です。 –

+0

私の主張は、サービスの実行と同じではないということです。 –

1

「DEBUG」または「RELEASE」モードになっているかどうかを確認してください。 "RELEASE"モードでサービスをデバッグしようとしていたときにこのエラーが発生しました。私はそれを "DEBUG"に変更したところ、すべて正常に機能しました。

これは、上記の他の人に推薦されたサービスを正しくインストールした後です。

0

私は同じエラーがあります。 @Cを試した。ローレンスの解決策。サービスリストでサービスが実行されていても、同じエラーが表示されます。デバッグメニューのプロセスにアタッチすることを提案したブログを読んで、プロセスのリストに自分のサービスが表示されないのを見ています。

この問題の解決方法については、お勧めします。

ありがとうございました。

+1

これは答えではありません。それはコメントか新しい質問でなければなりません(このような既存の質問がない場合) – Joshua

+0

はい、問題は私がこの場所で新しいと私は50ポイントや何かを得るまでコメントすることができませんでしたか?うんざりして申し訳ありません。とにかくコメントしてくれてありがとう。 – CodeJammer

+0

サービスプロセスに接続するには管理者権限で実行する必要があると思います。管理者のコマンドプロンプトから 'sc queryex <サービス名>'を使用してPIDを確認できるはずです。また、プロセスにアタッチする画面のPID列ヘッダーをクリックしてPIDでソートすることもできます。 –

1

このエラーが発生しないようにして、通常のサービスコントローラーの外部でサービスを実行できるようにするには、Environment.UserInteractiveフラグを確認します。設定されている場合、そのエラーを返すServiceBaseコードに実行させるのではなく、コンソールに出力してサービスを実行できます。 OnStartメソッドとOnStopメソッドはあなたのサービスでprotectedされているような

 if (Environment.UserInteractive) 
     { 
      var service = new WindowsService(); 
      service.TestInConsole(args); 
      return; 
     } 

あなたは別のものを追加する必要があります。ServiceBaseを使用するコードは、サービスを実行する前に、

、Program.Main()の先頭にこれを追加あなたがメイン(から実行することができ、そのクラスのメソッド)とのような、あなたのためにそれらのメソッドを呼び出します。

public void TestInConsole(string[] args) 
    { 
     Console.WriteLine($"Service starting..."); 
     this.OnStart(args); 
     Console.WriteLine($"Service started. Press any key to stop."); 
     Console.ReadKey(); 
     Console.WriteLine($"Service stopping..."); 
     this.OnStop(); 
     Console.WriteLine($"Service stopped. Closing in 5 seconds."); 
     System.Threading.Thread.Sleep(5000); 
    } 

最後に、出力は、プロジェクトのプロパティでコンソールアプリケーションであることを確認してください。

他のサービス実行可能ファイルと同じようにサービス実行可能ファイルを実行すると、コンソールとして起動します。 Visual Studioから起動すると、デバッガは自動的に接続します。それを登録してサービスとして起動すると、変更なしでサービスとして適切に実行されます。

私が見つけた唯一の違いは、コンソールアプリケーションとして実行するとコードがイベントログに書き込まれないことです。コンソールに通常ログオンするものを出力することもできます。

このサービスのデバッグ手法は、Iを誓っませんでしたdocs.microsoft.com

+0

リンクを追加していただきありがとうございます。 – dare2k

関連する問題