Frage

Was ist der beste Weg, in C # ein Dienstprogramm App einrichten, die von der Kommandozeile ausgeführt werden kann, und eine Ausgabe erzeugen (oder in eine Datei schreiben), aber das als Windows-Dienst ausgeführt werden, könnte auch seine Arbeit zu tun im Hintergrund (zB ein Verzeichnis überwacht, oder was auch immer).

Ich mag den Code nur einmal schreiben zu können und in der Lage sein, entweder von Powershell oder einem anderen CLI interaktiv zu nennen, aber zugleich fand auch eine Möglichkeit, die gleiche EXE-Datei als Windows-Dienst zu installieren und habe es unbeaufsichtigt laufen .

Kann ich das tun? Und wenn ja: wie kann ich dies tun

War es hilfreich?

Lösung

Ja, Sie können.

Eine Möglichkeit, es zu tun wäre, eine Befehlszeile param zu verwenden, sagen Sie „/ console“, der Konsolen-Version zu sagen, abgesehen von der Flucht als Service-Version:

  • Erstellen Sie eine Windows-Konsole App und dann
  • in der Program.cs, genauer gesagt in der Main-Funktion können Sie auf das Vorhandensein des "/ console" param
  • testen
  • , wenn die "/ console" ist, starten Sie das Programm normalerweise
  • , wenn der param nicht da ist, rufen Sie Ihre Service-Klasse von einem Servicebase


// Class that represents the Service version of your app
public class serviceSample : ServiceBase
{
    protected override void OnStart(string[] args)
    {
        // Run the service version here 
        //  NOTE: If you're task is long running as is with most 
        //  services you should be invoking it on Worker Thread 
        //  !!! don't take too long in this function !!!
        base.OnStart(args);
    }
    protected override void OnStop()
    {
        // stop service code goes here
        base.OnStop();
    }
}

...

Dann in Program.cs:


static class Program
{
    // The main entry point for the application.
    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun;

    if ((args.Length > 0) && (args[0] == "/console"))
    {
        // Run the console version here
    }
    else
    {
        ServicesToRun = new ServiceBase[] { new serviceSample () };
        ServiceBase.Run(ServicesToRun);
    }
}

}

Andere Tipps

Der beste Weg, dies von einem Design-Standpunkt aus zu erreichen ist es, alle Funktionen in einem Bibliothek-Projekt zu implementieren und einem separaten Wrapper Projekten um ihn zu bauen, wie Sie wollen (dh einen Windows-Dienst, ein Kommandozeilen-Programm auszuführen, ein asp. netto-Web-Service, ein WCF-Dienst etc.)

Ja, es kann getan werden.

Ihre Startklasse muss Servicebase erweitern.

Sie können Ihre static void Main (string [] args) Startmethode verwenden, um eine Befehlszeilenoption zu analysieren im Konsolenmodus ausgeführt werden.

So etwas wie:

static void Main(string[] args)
{
   if ( args == "blah") 
   {
      MyService();
   } 
   else 
   {
      System.ServiceProcess.ServiceBase[] ServicesToRun;
      ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyService() };
      System.ServiceProcess.ServiceBase.Run(ServicesToRun);
   }

Ein Windows-Dienst ist ganz anders als ein normales Windows-Programm; du bist besser dran nicht auf einmal zu tun zwei Dinge zu versuchen.

Haben Sie darüber nachgedacht, ihm eine geplante Aufgabe zu machen, statt?

Windows-Dienst vs geplante Aufgabe

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top