Ich schreibe gerade einen kleinen Bootstrap-Code für einen Dienst, der in der Konsole ausgeführt werden kann. Es läuft im Wesentlichen darauf hinaus, die OnStart()-Methode aufzurufen, anstatt die ServiceBase zu verwenden, um den Dienst zu starten und zu stoppen (weil die Anwendung nicht ausgeführt wird, wenn sie nicht als Dienst installiert ist und die Fehlersuche zu einem Albtraum wird).
Im Moment verwende ich Debugger.IsAttached, um festzustellen, ob ich ServiceBase.Run oder [service].OnStart verwenden sollte, aber ich weiß, dass ist nicht die beste Idee, weil einige Male Endbenutzer den Dienst in einer Konsole ausführen möchten (um die Ausgabe usw. in Echtzeit zu sehen).
Haben Sie eine Idee, wie ich feststellen kann, ob der Windows-Dienstcontroller "mich" gestartet hat oder ob der Benutzer "mich" in der Konsole gestartet hat? Anscheinend Umgebung.IsUserInteractive ist nicht die Antwort. Ich dachte an die Verwendung von Befehlszeilen-Args, aber das scheint "schmutzig".
Ich könnte immer sehen, über eine Try-Catch-Anweisung um ServiceBase.Run, aber das scheint schmutzig. Bearbeiten: Try-Catch funktioniert nicht.
Ich habe eine Lösung: Ich stelle sie hier für alle anderen interessierten Stacker auf:
public void Run()
{
if (Debugger.IsAttached || Environment.GetCommandLineArgs().Contains<string>("-console"))
{
RunAllServices();
}
else
{
try
{
string temp = Console.Title;
ServiceBase.Run((ServiceBase[])ComponentsToRun);
}
catch
{
RunAllServices();
}
}
} // void Run
private void RunAllServices()
{
foreach (ConsoleService component in ComponentsToRun)
{
component.Start();
}
WaitForCTRLC();
foreach (ConsoleService component in ComponentsToRun)
{
component.Stop();
}
}
EDIT: Es gab eine andere Frage auf StackOverflow, wo der Kerl Probleme mit dem Environment.CurrentDirectory hatte, das " C:\Windows\System32 "Sieht so aus, als könnte das die Antwort sein. Ich werde das heute testen.
0 Stimmen
Vielen Dank, dass Sie Ihre Lösung hinzugefügt haben, das sollte eine nützliche Referenz sein.
2 Stimmen
Nicht, dass IsUserInteractive no für Konsolenanwendungen false zurückgeben, wie es in dem Link, den Sie oben angegeben haben, angegeben wurde - zumindest nicht generell. Ich benutze es für diesen Zweck und hatte nie irgendwelche Probleme damit.
0 Stimmen
Hier ist die gleiche Frage für C++
0 Stimmen
Ist damit Ihre Frage beantwortet? Erkennen, ob der Code als Dienst ausgeführt wird
0 Stimmen
@MarkovskI In der Regel stufe ich die neuere Frage als Duplikat dieser älteren Frage ein und füge, wenn möglich, eine Antwort auf die ältere Frage (in diesem Fall diese Frage) hinzu, wenn dies von Nutzen ist.
1 Stimmen
@MarkSchultheiss wenn ich Sie richtig verstanden habe, habe ich eine Antwort zu diesem Thema hinzugefügt, sie wurde gelöscht :)
0 Stimmen
@MarkovskI Ja, ich hätte Ihre vollständige Antwort hier eingefügt und dann die andere Frage als Duplikat markiert, aber das mache ich nur bei älteren Fragen, die ich für "verdienstvoller" halte, aus keinem anderen Grund als dem, dass sie älter sind, aber das bin vielleicht nur ich.