2009-07-14 27 views
4

私はVB.NET 2008でWindowsサービスを開発していますが、私は動脈瘤があるように感じています。サービスをデバッグするために、初期化コードに15秒の待機時間を追加しました。サービスを開始して何かが起きる前に.NETデバッガを接続する時間が与えられます。したがって、ブレークポイントなどを打つことができます。私はこのタイプの回避策で "統合された"デバッグが本当に欠けており、テストは非常に苦しいと思われます。Windowsサービスを開発/デバッグする最も簡単な方法

開発中のWindowsサービスの「通常の」デバッグを行う最良の方法は何ですか?私が考えていた1つの選択肢は、すべてのロジックをDLLプロジェクトに移動し、サービス自体に制御ロジックだけを残し、基本的に「開始」ボタンと「停止」ボタンを持つFormsプロジェクトを作成して呼び出すというものでした他のすべてを行うDLL。このようにして、私は自分のコードを正常にデバッグして、DLLが準備できたらコンパイルしたサービスだけをデプロイできます。

これは意味がありますか?私は利用可能な回避策があれば公開しています。 PBの提案hereは私が求めているように聞こえます - 誰もこのアプローチを使用していますか?

+0

彼らはプログラマのために病院で動脈瘤病棟を開始する必要があります。私はあなたにそこに参加します。 –

答えて

7
Debugger.Break() 

:)

+0

明らかに、私はこのアイデアが有効であったことを誰かに分かち合う必要がありました。それは魅力のように機能し、通常のデバッガよりも接続が遅くならないように見えます。 – SqlRyan

+0

ええ、たぶん私の頭は厚いですか? Debugger.Break()をOnStart()の最初の行として追加し、サービスを開始します。今度は進行中であることを示す進捗バーが表示されます。その後、VSで私はプロセスにアタッチします - それは表示されていますが、グレー表示されています。私はデバッガをアタッチできません。何か不足していますか? –

6

私は.NETを使用してWindowsサービスを開発する場合、私は添付しなくても、ユニットテストではサービスのコードを実行できるように、私はユニットテストプラスTypeMockを活用しますサービスの実行中のインスタンスに送信します。あなたが見ることができる他の模造フレームワークはRhino Mocksを含んでいます。

私の計画は、私のサービスに対して実行されるユニットテストプロジェクトとテストメソッドを作成するためにMSTestを使用することでした。また、実行時の依存関係は、サービスのモックオブジェクトを作成するTypeMockによって処理されます。たとえば、サービスでファイルを処理する場合、TypeMockを使用してモックファイルを作成し、それをユニットテストで使用してサービスに渡すことができます。

以前は、サービスのコンパイル、インストール、実行、添付などの苦労を経験しました。モックフレームワークを発見したとき、ワンクリックでコードをテストできるようになりましたVisual Studio IDEのボタンをクリックします。

お試しください。 leppieなどのような

1

PB's suggestion、使用を含めて、言った:

Debugger.Break() 

しかし、また、あなたのサービスが実行されると、実行中のサービスプロセスにVS.NETを添付し、ブレークポイントを設定できることを覚えておいてください。もちろん、ブレークポイントのコードが自動的にヒットすると、速くアタッチする必要がありますが、私の場合はサービスがリクエストを処理するため、サービスにアタッチしてリクエストをトリガーします。

2

拡張子が.EXEのコマンドラインアプリケーションとして実行されるWCFサービスをビルドしました。これにより、ダブルクリックするだけで、アプリケーションをVSのデバッグや外部で簡単に読み込むことができます。次に、Windowsサービスホストであり、WCFサービスプロジェクトへの参照を持つ別のプロジェクトがあります。ホストサービスは.dllファイルと同じ方法で.exeファイルを処理できます。

これは経験したことのない問題があるため、「ベストプラクティス」として推奨できませんが、私にとってはうまく機能し、対処している問題を解決します。

+0

これは、単一の.exeとコマンドラインオプションで行うことができます。コンソールアプリケーションとして起動された場合、起動スレッドは 'Service.Start()'を呼び出し、キー押下(または何か)を待ってから 'Service.Stop()'を呼び出します。したがって、ほとんどすべてのコードをデバッグすることができます。 – Richard

2

Windowsサービスをコンソールアプリケーションとして作成し、MainからService_Startコマンドにinitコードを移動するだけです。これはほとんどのサービスで機能します。コンソールアプリケーションを使用して、サービスの停止/開始機能をテストすることもできます。

13

少しC#を処理できるなら、これが私のやり方です。

ServiceBaseから派生したmainServiceがonStartメソッドで派生していると仮定すると、デバッガ内で実行していないときはサービスが正常に起動します。そうでない場合はコンソールモードでコードを実行するonStartが手動で呼び出されます。

static void Main(string[] args) 
{ 
     // If no command line arguments, then run as a service unless we are debugging it. 
     if (args.Length == 0) 
     { 
      if (System.Diagnostics.Debugger.IsAttached) 
      { 
       System.Diagnostics.Debugger.Break(); 
       args = new string[] { "/NonService"} ; 
      } 
      else 
       args = new string[] { "/Service"} ; 
     } 

     string cmdLine = args[0].ToLower().Substring(1); 
     Console.WriteLine("Starting Program with Cmdline : " + args[0]); 
     switch (cmdLine) 
     { 
      case "service" : 
       ServiceBase.Run(new MainService()); 
       break; 

      case "nonservice" : 
       MainService ms = new MainService(); 
       ms.OnStart(null); 
       break; 

     ... 

     default : 
      Console.Error.WriteLine("Unknown Command line Parameter"); 
      Console.Error.WriteLine("Supported options are /Install /Uninstall /Start /Stop /Status /Service and /NonService"); 
     } 
+0

プロジェクトプロパティの[出力タイプ]とは何ですか? 'コンソールアプリケーション'? –

+2

はいコンソールアプリケーションです。 – sgmoore

+0

+1 - 基本的に唯一の方法は、開発/デバッグ中にサービスを持たず、cmdラインアプリケーションからそれを取り除くことです。サービス自体はデバッグするのに苦労します。 – TomTom

10

別にいくつかの他の人がすでに述べてきたDebugger.Break()の使用から、私は、実際のWindowsサービスプロジェクト自体に別々のアセンブリ内のすべての私のサービスのコードを記述します。私は同じサービスコードを呼び出すWindowsコンソールアプリケーションも作成します。これにより、コンソールアプリをスタートアッププロジェクトとして設定するだけで、IDEでデバッグすることができます。

WindowsサービスプロジェクトとWindowsコンソールアプリケーション自体は、サービス「コア」コードを呼び出す以外は何もしません。そのため、サービスとコンソールアプリケーションの違いによる不具合の範囲は最小限に抑えられます。

3

もう一つの方法は、ファイルをservice1.designer.vbに行く見つけ、このような次のメソッドのコードを「カプセル化」することです:

Shared Sub Main() 
#If DEBUG Then 
    Dim servicio As New Service1 
    servicio.OnStart(Nothing) 
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite) 
#Else 
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase    'original code 
    ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service1} 'original code 
    System.ServiceProcess.ServiceBase.Run(ServicesToRun)     'original code 
#End If 

・ホープそこレガシーコードでこれらのプログラマのためのこのヘルプ;) クレジットは私に教えてくれた仲間のプログラマーに行きます。

-1

Debugging a .Net Windows Service the "easy way"を読んでください。この記事では、Mark PearceがVisual Studioから.Net Windowsサービスをデバッグする方法について説明します。本質的には、次のコードスニペットになっていますが、完全な解決方法については記事を読んでください。

Shared Sub Main() 
#If DEBUG Then 
    Dim DebugService As New ServiceAdmin 
    DebugService.OnStart(Nothing) 
#Else 
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase 
    ServicesToRun = New System.ServiceProcess.ServiceBase() {New ServiceAdmin()} 
    System.ServiceProcess.ServiceBase.Run(ServicesToRun) 
#End If 
End Sub 
+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –

関連する問題