2011-05-19 8 views
26

Encontré un código de ejemplo publicado en https://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/4d45e9ea5471cba4/4519371a77ed4a74?hl=en&pli=1 para la instalación automática de un servicio de Windows. Estoy en C# en fx 4.0. Tratando de averiguar donde fui fuera de los carriles ...¿Está ejecutando un servicio de Windows en modo consola?

Mis preguntas:

  1. he creado un proyecto de victorias servicio. En program.cs/main() prácticamente copié el ejemplo de código en . Parece que todo está funcionando excepto iniciando una ventana de consola si estoy en el modo DEPURAR (pasando en - c por supuesto). Por algún motivo, la ventana de la consola nunca se abre.
  2. El otro desafío que tuve fue la llamada a StartUp()/ShutDown() en , la parte de la consola no se compilaría. Terminé inicializando el objeto de servicio y luego lo llamé.
  3. estoy recibiendo el siguiente error cuando se llama al método Console.ReadKey():

No se puede leer teclas cuando sea aplicación no tiene una consola o cuando la entrada de la consola ha sido redirigida desde un archivo. Pruebe Console.Read.

Mi código y esas cosas:

Una imagen de mi estructura del proyecto:

http://screencast.com/t/zVjqkmoED

NOTA: Yo estaba duplicando la secuencia de arranque en el TestHarness cuando en modo de depuración. Si/cuando esto funcione, dejaré caer ese de la solución. El proyecto de la biblioteca es donde vive la mayoría de mi código .

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

¡Y encontré mi respuesta! Las propiedades de mi proyecto se configuraron en la aplicación de Windows en lugar de la aplicación de la consola. DOH! –

Respuesta

58

y me encontré con mi respuesta! Las propiedades de mi proyecto se establecieron en Aplicación de Windows en lugar de Aplicación de consola. DOH! (Propiedades del proyecto> Pestaña de aplicaciones> Tipo de salida :)

0

Además .. en lugar de usar -console arg, puede identificar su consola utilizando Environment.UserInteractive, que será falso cuando se ejecuta como servicio, pero es verdadero al ejecutar el EXE directamente.

Cuestiones relacionadas