Ich beginne mit einem Beispiel: Apache Webserver (unter Windows) hat eine nette Funktion: Er kann sowohl als eigenständige Anwendung (mit aktuellen Benutzerrechten) ausgeführt werden, als auch als Windows-Dienst installiert und ausgeführt werden direkt (als lokales Systemkonto), mit derselben ausführbaren Datei.Wie Windows-Dienst-Anwendung zu machen, so dass es als eigenständiges Programm als auch laufen kann?
Damit die Anwendung als eigenständige App ausgeführt werden kann, muss sie nur statisch public Main() in einer öffentlichen Klasse haben.
Damit die Anwendung installierbar und als Dienst ausführbar ist, muss sie ServiceBase- und Installer-Klassen in bestimmter Weise implementieren. Aber wenn eine Anwendung wie diese als Standalone-App ausgeführt wird, wird das Meldungsfeld angezeigt.
Wie kann diese Apache-ähnliche Arbeitsweise erreicht werden? Ich glaube, die Lösung ist einfach, aber ich habe keine Ahnung, wo ich anfangen soll.
Der folgende Code wird zum Aufrufen des Dienstes verwendet. Kann es geändert werden, um eine eigenständige Nutzung zu ermöglichen?
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service() // defined elsewhere as Service : ServiceBase
};
ServiceBase.Run(ServicesToRun);
}
}
Meine Sprache der Wahl ist C#.
Bearbeiten: Derzeit habe ich gemeinsamen Code in separate Assembly abstrahiert (nennen wir es Library.dll), und ich habe zwei ausführbare Dateien: Console.exe und Service.exe, die eigenständige und Windows-Dienstanwendungen sind , und beide sind nur Mittel zum Aufrufen von Library.dll.
Mein Ziel ist es, diese beiden ausführbaren Dateien zu einer zusammenführen, die immer noch zu Library.dll aufrufen wird.
Vorsicht: Environment.UserInteractive wird nur verwendet, um zu überprüfen, ob eine grafische Desktop-Sitzung vorhanden ist, und das Ergebnis wird nur verwendet, um zu bestimmen, ob eine Dialog- oder Konsolenmeldung angezeigt werden soll. UserInteractive gibt auch true zurück, wenn es als Dienst ausgeführt wird, der mit dem Desktop interagieren darf. Die echte Überprüfung erfolgt innerhalb nativer Methoden. – Ishmaeel
@Ishmaeel: danke, guter Punkt. Wusste nicht, dass diese beiden Modi verwandt waren. Haben Sie ein Beispiel für native Methoden, die dies überprüfen können? –
Offenbar ruft ServiceBase nur die Funktion StartServiceCtrlDispatcher (http://msdn.microsoft.com/en-us/library/ms686324(VS.85).aspx) auf, und ein Rückgabewert ungleich Null (wahrscheinlich) bedeutet, dass Sie nicht als Dienst gestartet werden . Natürlich ist es nicht als Check nützlich, weil es genau die Operation ist, die Sie entscheiden möchten, ob sie ausgeführt werden soll oder nicht. Ich konnte noch keine richtige Check-Funktion finden. – Ishmaeel