2011-05-19 108 views
26

我发现一些示例代码发布在 https://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/4d45e9ea5471cba4/4519371a77ed4a74?hl=en&pli=1 自我安装Windows服务。我在fx 4.0的C#中。试图 找出在我出轨......在控制台模式下运行Windows服务?

我的问题:

  1. 我创建了一个服务取胜的项目。在program.cs/main()我几乎 复制代码示例。看起来大多数一切正在工作 ,除了如果我处于DEBUG模式(当然传入 - c)启动控制台窗口。出于某种原因,控制台窗口从不打开。
  2. 我遇到的另一个挑战是对 中的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 
    } 
} 
+0

我找到了我的答案!我的项目属性被设置为Windows应用程序而不是控制台应用程序。 DOH! – 2011-05-19 21:21:22

回答

58

而且我发现我的答案!我的项目属性设置为Windows应用程序而不是控制台应用程序。 DOH! (项目属性>应用程序选项卡>输出类型:)

0

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

相关问题