web-dev-qa-db-ja.com

Windowsサービスをコンソールモードで実行していますか?

https://groups.google.com/group/Microsoft.public.dotnet.languages.csharp/browse_thread/thread/4d45e9ea5471cba4/4519371a77ed4a74?hl=ja&pli=1 に投稿されたいくつかのサンプルコードを見つけましたWindowsサービスの自己インストール。私はfx 4.0のC#にいます。私がRailsからどこへ行ったかを理解しようとしています...

私の質問:

  1. Win Serviceプロジェクトを作成しました。 program.cs/main()で、コード例をほぼコピーしました。ほとんどすべてが機能しているように見えます例外DEBUGモード(もちろん-cで渡す)でコンソールウィンドウを起動します。何らかの理由でコンソールウィンドウが開かない。
  2. もう1つの問題は、コンソール部分のStartUp()/ ShutDown()の呼び出しがコンパイルされないことでした。結局、サービスオブジェクトを初期化してから呼び出す必要がありました。
  3. Console.ReadKey()メソッドが呼び出されると、次のエラーが発生します。

アプリケーションにコンソールがない場合、またはコンソール入力がファイルからリダイレクトされている場合は、キーを読み取ることができません。 Console.Readを試してください。

私のコードともの:

私のプロジェクト構造の画像:

http://screencast.com/t/zVjqkmoED

注:デバッグモードでは、TestHarnessで起動シーケンスを複製していました。私がこれを機能させる場合/私はそれをソリューションから削除します。ライブラリプロジェクトは、私のコードの大部分が存在する場所です。

PROGRAM.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.ComponentModel;
using System.Configuration.Install;
using System.Collections;
using RivWorks.FeedHandler.Service;

namespace RivWorks.FeedHandler
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static int Main(string[] args)
        {
            bool install = false, uninstall = false, console = false, rethrow = false;

            try
            {
                foreach (string arg in args)
                {
                    switch (arg)
                    {
                        case "-i":
                        case "-install":
                            install = true; break;
                        case "-u":
                        case "-uninstall":
                            uninstall = true; break;
                        case "-c":
                        case "-console":
                            console = true; break;
                        default:
                            Console.Error.WriteLine("Argument not expected: " + arg);
                            break;
                    }
                }
                if (uninstall)
                {
                    Install(true, args);
                }
                if (install)
                {
                    Install(false, args);
                }
                if (console)
                {
                    Console.WriteLine("Starting...");
                    FeedListener fl = new FeedListener();
                    fl.StartUp();
                    Console.WriteLine("System running; press any key to stop");
                    Console.ReadKey(true);
                    fl.ShutDown();
                    Console.WriteLine("System stopped");
                }
                else if (!(install || uninstall))
                {
                    rethrow = true; // so that windows sees error...
                    ServiceBase[] services = { new Service.FeedListener() };
                    ServiceBase.Run(services);
                    rethrow = false;
                }
                return 0;
            }
            catch (Exception ex)
            {
                if (rethrow) throw;
                Console.Error.WriteLine(ex.Message);
                return -1;
            }
        }
        static void Install(bool undo, string[] args)
        {
            try
            {
                Console.WriteLine(undo ? "uninstalling" : "installing");
                using (AssemblyInstaller inst = new AssemblyInstaller(typeof(Program).Assembly, args))
                {
                    IDictionary state = new Hashtable();
                    inst.UseNewContext = true;
                    try
                    {
                        if (undo)
                        {
                            inst.Uninstall(state);
                        }
                        else
                        {
                            inst.Install(state);
                            inst.Commit(state);
                        }
                    }
                    catch
                    {
                        try
                        {
                            inst.Rollback(state);
                        }
                        catch { }
                        throw;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.Message);
            }
        }
    }


    [RunInstaller(true)]
    public sealed class MyServiceInstallerProcess : ServiceProcessInstaller
    {
        public MyServiceInstallerProcess()
        {
            this.Account = ServiceAccount.NetworkService;
        }
    }

    [RunInstaller(true)]
    public sealed class MyServiceInstaller : ServiceInstaller
    {
        public MyServiceInstaller()
        {
            this.Description = "Provides a service to listen for, then import, feed files from various sources.";
            this.DisplayName = "RIVWorks Feed Handler (.NET 4.0)";
            this.ServiceName = "FeedListener";
            this.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
        }
    }
}

FEEDLISTENER.CS

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
using sysIO = System.IO;
using RivWorks.FeedHandler;
using System.Collections;
using RivWorks.FeedHandler.Library;
using System.Threading;

namespace RivWorks.FeedHandler.Service
{
    public partial class FeedListener : ServiceBase
    {
        #region Declarations
        static private List<string> _keys = new List<string>();
        static private System.Threading.Timer _clock = null;
        static private FileSystemWatcher _watcher;
        static private RivWorks.FeedHandler.Library.QueueHandler _qHandler = null;
        static private bool _isDequeueing = false;
        #endregion

        #region Constructor
        public FeedListener()
        {
            InitializeComponent();
        }
        #endregion

        #region Internal Methods
        internal void StartUp() {...}
        internal void ShutDown() {...}
        #endregion

        #region Start/Stop
        protected override void OnStart(string[] args)
        {
            StartUp();
        }
        protected override void OnStop()
        {
            ShutDown();
        }
        #endregion

        #region Event Handlers
        static void qHandler_QueuesGrew() {...}
        static void qHandler_QueuesShrunk() {...}
        static void qHandler_QueuesChanged() {...}
        static void fileCreatedOrChanged(object sender, sysIO.FileSystemEventArgs e) {...}
        #endregion

        #region Private Methods
        private static void Tick(object state) {...}
        private static void WriteToEventLog(Exception ex, EventLogEntryType eventLogEntryType) {...}
        private static void WriteToEventLog(string message, EventLogEntryType eventLogEntryType) {...}
        #endregion
    }
}
33
Keith Barrows

そして私は私の答えを見つけました!プロジェクトのプロパティがConsole AppではなくWindows Appに設定されました。 DOH! (プロジェクトプロパティ>アプリケーションタブ>出力タイプ:)

67
Keith Barrows

また、-console argを使用する代わりに、Environment.UserInteractiveを使用してコンソールを識別できます。これは、サービスとして実行する場合はfalseになりますが、EXEを直接実行する場合はtrueになります。

1
Yogev Smila