Ist es möglich, die Windows-Dienste in Visual Studio zu debuggen?
Ich habe Code wie verwendet
System.Diagnostics.Debugger.Break();
aber es gibt einige Codefehler wie:
Ich habe zwei Ereignisfehler erhalten: eventID 4096 VsJITDebugger und "Der Dienst hat nicht rechtzeitig auf die Start- oder Steuerungsanforderung reagiert."
Sie können dies auch versuchen.
(Nach langem googeln fand ich dies unter "Debuggen der Windows-Dienste in Visual Studio".)
quelle
Sie sollten den gesamten Code trennen , die wird tun Sachen aus dem Service - Projekt in ein separates Projekt, und dann eine Testanwendung, dass Sie normalerweise laufen und debuggen können.
Das Serviceprojekt wäre nur die Shell, die zur Implementierung des Serviceteils benötigt wird.
quelle
Entweder das, wie von Lasse V. Karlsen vorgeschlagen, oder Sie richten eine Schleife in Ihrem Dienst ein, die darauf wartet, dass ein Debugger angehängt wird. Das einfachste ist
Auf diese Weise können Sie den Dienst starten und in Visual Studio "An Prozess anhängen ..." auswählen und an Ihren Dienst anhängen, um dann die normale Ausführung fortzusetzen.
quelle
if (Environment.UserInteractive) { InteractiveRun(args); } else { Service instance = new Service(); ServiceBase[] servicesToRun = new ServiceBase[] { instance }; ServiceBase.Run(servicesToRun); }
Start
/OnStart()
ich denkefoo(bar)
Angesichts
ServiceBase.OnStart
derprotected
Sichtbarkeit bin ich den Reflexionsweg gegangen, um das Debuggen zu erreichen.Beachten Sie, dass dies
Thread
standardmäßig ein Vordergrund-Thread ist.return
WennMain
der Faux-Service-Thread ausgeführt wird, wird der Vorgang nicht beendet.quelle
In einem Microsoft-Artikel wird erläutert, wie Sie hier einen Windows-Dienst debuggen und welchen Teil jeder übersehen kann, wenn er ihn durch Anhängen an einen Prozess debuggt.
Unten ist mein Arbeitscode. Ich habe den von Microsoft vorgeschlagenen Ansatz verfolgt.
Fügen Sie diesen Code hinzu zu
program.cs
:Fügen Sie diesen Code der ServiceMonitor-Klasse hinzu.
Gehen Sie nun zu Projekteigenschaften , wählen Sie die Registerkarte "Anwendung" und wählen Sie beim Debuggen den Ausgabetyp als "Konsolenanwendung" oder nach dem Debuggen "Windows-Anwendung" aus, kompilieren Sie Ihren Dienst neu und installieren Sie ihn.
quelle
Sie können eine Konsolenanwendung erstellen. Ich benutze diese
main
Funktion:Meine
ImportFileService
Klasse ist genau die gleiche wie in der Anwendung meines Windows-Dienstes, mit Ausnahme von heiritant (ServiceBase
).quelle
ServiceBase
)" gesagt . Ich finde es einfacher, in einer Konsolen-App zu debuggen, aber ich verstehe, wenn das nicht alle überzeugt.Sie können auch System.Diagnostics.Debugger.Launch () ausprobieren. Methode . Es hilft dabei, den Debugger-Zeiger auf den angegebenen Speicherort zu bringen, und Sie können dann Ihren Code debuggen.
Vor diesem Schritt installieren Sie bitte Ihre service.exe über die Befehlszeile der Visual Studio-Eingabeaufforderung - installutil projectservice.exe
Starten Sie dann Ihren Dienst über die Systemsteuerung -> Verwaltung -> Computerverwaltung -> Dienst und Anwendung -> Dienste -> Ihr Dienstname
quelle
Ich habe diesen Code gerade zu meiner Serviceklasse hinzugefügt, damit ich OnStart indirekt aufrufen kann, ähnlich wie bei OnStop.
quelle
Ich verwende den
/Console
Parameter im Visual Studio-Projekt Debug → Startoptionen → Befehlszeilenargumente :quelle
Ich habe diese Frage gefunden, aber ich denke, eine klare und einfache Antwort fehlt.
Ich möchte meinen Debugger nicht an einen Prozess anhängen, möchte aber dennoch den Dienst
OnStart
und dieOnStop
Methoden aufrufen können. Ich möchte auch, dass es als Konsolenanwendung ausgeführt wird, damit ich Informationen von NLog auf einer Konsole protokollieren kann .Ich habe diese brillanten Anleitungen gefunden, die dies tun:
Debuggen eines Windows-Dienstprojekts
Einfachere Möglichkeit zum Debuggen eines Windows-Dienstes
Ändern Sie zunächst die Projekte
Output type
inConsole Application
.Ändern Sie Ihre
Program.cs
, um so auszusehen:Fügen Sie dann die folgende Methode hinzu, damit Dienste im interaktiven Modus ausgeführt werden können.
quelle
Ich verwende ein großartiges Nuget-Paket namens ServiceProcess.Helpers.
Und ich zitiere...
Es unterstützt das Debuggen von Windows-Diensten, indem es eine Benutzeroberfläche zum Abspielen / Stoppen / Anhalten erstellt, wenn ein Debugger angeschlossen ist, ermöglicht jedoch auch die Installation und Ausführung des Dienstes in der Windows Server-Umgebung.
All dies mit einer Codezeile.
http://windowsservicehelper.codeplex.com/
Nach der Installation und Verkabelung müssen Sie lediglich Ihr Windows-Dienstprojekt als Startprojekt festlegen und auf Ihrem Debugger auf Start klicken.
quelle
Wenn Sie zu Beginn eines Windows-Dienstvorgangs versuchen, etwas zu debuggen, funktioniert das "Anhängen" an den laufenden Prozess leider nicht. Ich habe versucht, Debugger.Break () in der OnStart-Prozedur zu verwenden, aber mit einer 64-Bit-kompilierten Visual Studio 2010-Anwendung gibt der Befehl break nur einen Fehler wie den folgenden aus:
Zu diesem Zeitpunkt müssen Sie in Ihrer Registrierung die Option "Image File Execution" für Ihre ausführbare Datei einrichten. Die Einrichtung dauert fünf Minuten und funktioniert sehr gut. Hier ist ein Microsoft-Artikel mit folgenden Details:
Gewusst wie: Starten Sie den Debugger automatisch
quelle
Probieren Sie die eigene Post-Build-Ereignisbefehlszeile von Visual Studio aus .
Versuchen Sie dies im Post-Build hinzuzufügen:
Wenn der Build-Fehler mit einer Meldung wie
Error 1 The command "@echo off sc query "ServiceName" > nul
so weiter, Ctrl+ Cdann Ctrl+V die Fehlermeldung in Notepad und schauen Sie sich den letzten Satz der Nachricht an.Es könnte heißen
exited with code x
. Suchen Sie hier nach dem Code in einem häufigen Fehler und sehen Sie, wie Sie ihn beheben können.Mehr zu Fehlercodes hier .
Und wenn der Build-Fehler mit Meldung wie dieser,
Öffnen Sie cmd und versuchen Sie dann, es zuerst mit zu töten
taskkill /fi "services eq ServiceName" /f
Wenn alles F5in Ordnung ist, sollte es ausreichen, um es zu debuggen.
quelle
Führen Sie in der
OnStart
Methode die folgenden Schritte aus.Führen Sie dann eine Eingabeaufforderung als Administrator aus und geben Sie Folgendes ein:
In der obigen Zeile wird test-xyzService in der Serviceliste erstellt.
Um den Dienst zu starten, werden Sie aufgefordert, eine Verbindung zum Debüt in Visual Studio herzustellen oder nicht.
So beenden Sie den Dienst:
So löschen oder deinstallieren Sie:
quelle
Debuggen Sie einen Windows-Dienst über http (getestet mit VS 2015 Update 3 und .Net FW 4.6).
Zunächst müssen Sie in Ihrer VS-Lösung ein Konsolenprojekt erstellen (Hinzufügen -> Neues Projekt -> Konsolenanwendung).
Erstellen Sie im neuen Projekt eine Klasse "ConsoleHost" mit diesem Code:
Und dies ist der Code für die Program.cs-Klasse:
Konfigurationen wie Verbindungszeichenfolgen sollten in die Datei App.config des Konsolenprojekts kopiert werden.
Um die Konsole zu öffnen, klicken Sie mit der rechten Maustaste auf Konsolenprojekt und klicken Sie auf Debuggen -> Neue Instanz starten.
quelle
Fügen Sie Ihrer Serviceklasse einfach einen Konstruktor hinzu (falls Sie ihn noch nicht haben). Unten können Sie ein Beispiel für Visual Basic .net finden.
Klicken Sie anschließend mit der rechten Maustaste auf das Projekt und wählen Sie " Debuggen -> Neue Instanz starten ".
quelle