在控制台模式下运行Windows服务?

时间:2011-05-19 21:17:32

标签: c#-4.0 windows-services console

我发现了一些示例代码 https://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/4d45e9ea5471cba4/4519371a77ed4a74?hl=en&pli=1 用于自行安装Windows服务。我在fx 4.0的C#中。试 找出我离开轨道的地方......

我的问题:

  1. 我创建了一个Win Service项目。在program.cs / main()我几乎 复制了代码示例。似乎大多数都在运作 除了启动控制台窗口,如果我处于DEBUG模式(传入 - 当然是)。由于某种原因,控制台窗口永远不会打开。
  2. 我遇到的另一个挑战是调用StartUp()/ ShutDown() 控制台部分无法编译。我最终不得不初始化 我的服务对象,然后调用它。
  3. 调用Console.ReadKey()方法时出现以下错误:
  4.   

    无论何时都无法读取密钥   应用程序没有控制台或   控制台输入被重定向时   从文件。试试Console.Read。

    我的代码和内容:

    我的项目结构图片:

    http://screencast.com/t/zVjqkmoED

    注意:我在TestHarness中重复启动序列 在DEBUG模式下。如果/当我得到这个工作,我会放弃它 从解决方案。图书馆项目是我的大部分 代码生活。

    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
        }
    }
    

3 个答案:

答案 0 :(得分:65)

我找到了答案!我的项目属性设置为 Windows应用程序,而不是控制台应用程序。 DOH! (项目属性&gt;应用程序选项卡&gt;输出类型:)

答案 1 :(得分:1)

另外..而不是使用-console arg,您可以使用Environment.UserInteractive来识别其控制台,当作为服务运行时它将是false,但在直接运行EXE时为true。

答案 2 :(得分:-1)

您还可以查看此内容:http://www.thedavejay.com/2012/04/self-installing-c-windows-service-safe.html

它允许您作为控制台应用程序进行调试,并将相同的应用程序安装为Windows服务,而无需更改项目类型。