web-dev-qa-db-ja.com

Visual StudioからWindowsサービスを実行する方法(F5)

Visual StudioからWindowsサービスプロジェクトを実行する方法。

Visual Studio 2008でWindowsサービスを構築しています。常にコントロールパネルからサービスを実行し、サービスの実行中のインスタンスにデバッガーをアタッチする必要があります。多くのコードをクリーンアップしていて、開発中に何度もサービスを再起動する必要があるので、これは一種の迷惑です。

F5キーを押してサービスを実行し、直接デバッグモードに入ることができるようにプロジェクトをセットアップしたいと思います。これを達成するためのいくつかのヒントは素晴らしいでしょう。

前もって感謝します!!!

31
dotnetcoder

here からコピー.

_static void Main(string[] args)  
{  
    DemoService service = new DemoService();  

    if (Environment.UserInteractive)  
    {  
        service.OnStart(args);  
        Console.WriteLine("Press any key to stop program");  
        Console.Read();  
        service.OnStop();  
    }  
    else 
    {  
        ServiceBase.Run(service);  
    }  
}  
_

これにより、Visual Studio内から実行できるようになります。

もう1つの方法は、System.Diagnostics.Debugger.Break()を呼び出してプログラムのブレークポイントをコードに埋め込むことです。これを、たとえばサービスのOnStart()コールバックに配置して、サービスコンソールからサービスを開始すると、プログラムによるブレークポイントによってダイアログボックスがトリガーされ、Visual Studioの既存のインスタンスに接続したり、新しいインスタンスを開始したりできますインスタンス。これは実際に、サービスのデバッグに使用するメカニズムです。

28
Matt Davis

Main()ルーチンで_Debugger.IsAttached_を確認し、trueの場合はコンソールのようにアプリを起動し、そうでない場合はServiceBase.Run()を呼び出します。

7
Samuel Neff

コンソールアプリとして実行され、リフレクションを使用してサービスメソッドにアクセスするWindowsサービスにコンパニオンプロジェクトを設定することができます。詳細と例については、こちらをご覧ください: http://ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/

コンソールアプリケーションに必要な関連コードは次のとおりです。

using System;
using System.Reflection;

namespace TestableWindowsService
{
  class TestProgram
  {
    static void Main()
    {
      Service1 service = new Service1();

      Type service1Type = typeof (Service1);

      MethodInfo onStart = service1Type.GetMethod("OnStart", BindingFlags.NonPublic | BindingFlags.Instance); //retrieve the OnStart method so it can be called from here

      onStart.Invoke(service, new object[] {null}); //call the OnStart method
    }
  }
}
4
Ryan Kohn

サービスプロジェクトを参照するだけの別のプロジェクトを作成し、サービスをインスタンス化して開始します。通常のアプリと同じように実行され、ステップインできます。

YourService s = new YourService();
s.Start();
2
Patrick Kafka

これを行うこともできます:(説明についてはコメントを参照してください)

public class Program : ServiceBase
{
    private ServiceHost _serviceHost = null;
    public Program()
    {
        ServiceName = "";
    }
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
                #if(!DEBUG)
               // when deployed(built on release Configuration) to machine as windows service use this
                  ServiceBase[] ServicesToRun;
                  ServicesToRun = new ServiceBase[]  {  new Program() };
                  ServiceBase.Run(ServicesToRun);
                #else
               // when debugging use this (When debugging after building in Debug Configuration)
               //If you want the DEBUG preprocessor constant in Release you will have to check it on in the project configuration
                Program progsvc = new Program();
                progsvc.OnStart(new string[] { });
                System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
                #endif                        
    }
    protected override void OnStart(string[] args)
    {
                // Start Web Service
                if (_serviceHost != null)
                {
                    _serviceHost.Close();
                }
                _serviceHost = new ServiceHost(typeof(Namespace.Service));
                _serviceHost.Open();
    }       
}
2
MannyRamirez

サービスコンストラクターからOnStart()イベントを呼び出すだけ

私は次のようにそれをしました

    public XXX()
    {
        InitializeComponent();
        OnStart(new string[] { "shafi", "moshy" });
    }
2
shafyxl

あなたはあなたのWindowsサービスをシェルとして使いたいのですが、そこにはコードをほとんど書かないはずなので、テストする必要はありません。

あなたはあなたのサービスがクラスでしたいすべてのものを持っているべきです。

あなたはあなたのクラスをユニットテストすることができ、それが機能するならそれをあなたのサービスに参照します。

このようにして、クラスに必要なすべてのことを実行させ、サービスに適用すると、すべてが機能するはずです。 :)

イベントログで、サービスの実行中にサービスが何を行っているかを確認できます。また、テストするための素晴らしい方法:Dを試してみてください。

namespace WindowsService
{
    public partial class MyService : ServiceBase
    {
        public MyEmailService()
        {
            InitializeComponent();
            if (!System.Diagnostics.EventLog.SourceExists("MySource")) // Log every event
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog"); // Create event source can view in Server Explorer
            }
            eventLogEmail.Source = "MySource";
            eventLogEmail.Log = "MyNewLog";  

            clsRetriveEmail Emails = new clsRetriveEmail();
            eventLogEmail.WriteEntry("Populateing database with mail"); // log event
            Emails.EmailGetList(); // Call class
        }
        protected override void OnStart(string[] args)
        {
            eventLogEmail.WriteEntry("Started");
        }
        protected override void OnStop()
        {
            eventLogEmail.WriteEntry("Stopped");
        }
        protected override void OnContinue()
        {    
            eventLogEmail.WriteEntry("Continuing");
        }
        }
    }
0
Pomster

これらのリンクは、サービスを操作するときに非常に役立ちます。

これは、それらの作成についてのウォークです http://msdn.Microsoft.com/en-us/library/zt39148a.aspx

James Michael Hareが彼のブログに掲載しています http://geekswithblogs.net/BlackRabbitCoder/ 彼が作成した本当に素晴らしいテンプレート/フレームワークについて書かれており、Windowsサービスの開発(およびデバッグ)を非常に簡単にしています:C#ツールボックス:デバッグ可能な自己インストール型Windowsサービステンプレート(1/2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2- creating-a-debuggable-windows.aspx

それはあなたがすぐに始めるために必要なすべての基本を提供します。そして何よりも、通常のコンソールアプリケーションのように、サービスをデバッグするための本当に素晴らしい方法を提供します。また、サービスをインストール(およびアンインストール)するためのすぐに使える機能を提供しているとも言えます。記事のパート2はこのリンクにあります。

私自身もこれを数回使用したことがあり、本当にお勧めできます。

0
Pomster