1. ホーム
  2. c#

[解決済み] .NETコンソールアプリケーションのWindowsサービス化

2022-04-26 06:22:15

質問

コンソールアプリケーションをWindowsサービスとして動作させたいと考えています。VS2010にはプロジェクトテンプレートがあり、コンソールプロジェクトを添付してWindowsサービスをビルドすることができます。 私は、分離したサービスプロジェクトを追加せず、可能であれば、サービスコードをコンソールアプリケーションに統合して、コンソールアプリケーションを1つのプロジェクトとして維持し、例えば、スイッチを使用してコマンドラインから実行した場合、コンソールアプリケーションとしてもWindowsサービスとしても実行できるようにしたいと思っています。

誰か、C#のコンソールアプリケーションを素早く簡単にサービスに変換できるクラスライブラリやコードスニペットを提案してくれないかな?

どのように解決するのですか?

私は通常、同じアプリをコンソールアプリケーションとして、またはサービスとして実行するために以下のテクニックを使用します。

using System.ServiceProcess

public static class Program
{
    #region Nested classes to support running as service
    public const string ServiceName = "MyService";

    public class Service : ServiceBase
    {
        public Service()
        {
            ServiceName = Program.ServiceName;
        }

        protected override void OnStart(string[] args)
        {
            Program.Start(args);
        }

        protected override void OnStop()
        {
            Program.Stop();
        }
    }
    #endregion
    
    static void Main(string[] args)
    {
        if (!Environment.UserInteractive)
            // running as service
            using (var service = new Service())
                ServiceBase.Run(service);
        else
        {
            // running as console app
            Start(args);

            Console.WriteLine("Press any key to stop...");
            Console.ReadKey(true);

            Stop();
        }
    }
    
    private static void Start(string[] args)
    {
        // onstart code here
    }

    private static void Stop()
    {
        // onstop code here
    }
}

Environment.UserInteractive は通常、コンソールアプリの場合はtrue、サービスの場合はfalseです。技術的には、ユーザーインタラクティブモードでサービスを実行することは可能なので、代わりにコマンドラインスイッチをチェックすることができます。