C# Windows Service... wie kann ich starten?

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.103
Ich will eine Windows Dienstanwendung Programmieren. Ich habe im Dienst ONSTART eine MessageBox ausgeben lassen. Nur wird dieser MessageBox garnicht angezeigt. Wieso?

Der Installer für dieser Dienst wurde auch implementiert...
Kennst sich da einer aus?
 
Hast du dem Service auch mitgegeben, dass er mit dem Desktop interagieren darf?
Services in der MMC öffnen, rechtsklick drauf, im Tabregister "Anmelden" als lokales Systemkonto und den Haken "Datenaustausch zwischen Dienst und Desktop zulassen" setzen.
 
Windows-Dienste dürften standardmäßig keine Fenster erzeugen, auch keine Messageboxen.
Ich nehme mal an du willst ihn bei OnStart debuggen, oder warum machst du sonst die MessageBox?

Zum Debuggen kannste in OnStart über System.Diagnostics.Debugger.Break() den Dienst anhalten und dich dann im Visual Studio über Extras -> An den Prozess anhängen an den Dienst anhängen. Der interaktive Debugger steht dann am Break und du kannst ganz normal weitergehen.
 
@toeffi,
ja es wird gestartet...

@cheft
Danke für den Tipp...

@MacGyver
gut zu wissen, dass man auch debuggen kann...

Ich habe kurzerhand den Dienstbau aufgegeben. Dachte dass man es eventuell im Hauptprogramm das Problem lösen kann.

Es geht mir darum, dass man die Daten automatisch laden soll, in die DB. Und hier hat eine Dienstanwendung den Vorteil, dass diese immer läuft.
Läuft es übrigens immer, oder muss man per hand starten wenn der Startvorgang auf automatisch gestellt wurde?

Ich hatte auch das Problem mit dem installutil. Offenbar muss die Servicedatei direkt im Ordner von installutil sein, sonst kann ich den Dienst nicht installieren.

Kann man mit hilfe von Installer Projekt den Dienst installieren und starten lassen? Irgendwie finde ich nur müll im Internet wenn ich danach suche!
 
ja das installutil... das hab ich auch gefressen und nutze es für die Services die ich baue überhaupt nicht.

Ich benutze immer das Kommandozeilen Tool sc.exe (sollte in jeder Windows Installation vorhanden sein) um Services zu installieren. Hat den Vorteil, dass man alles mit angeben kann und den Service auch auf einem Remote Rechner ohne Probleme installieren kann. (http://support.microsoft.com/kb/251192/de) Mann muss bei sc.exe nur darauf achten, dass nach jedem Parameter ein Leerzeichen folgen MUSS, also zum Beispiel sc.exe binPath=[Leerzeichen]"c:\myService\service.exe" ...] da hab ich am Anfang ganz schön gesucht...

Kontrollieren kann man den Service dann sehr komfortabel über den System.ServiceProcess.ServiceController. Allerdings muss ich dazu sagen, dass ich hauptsächlich in VB.NET entwickle und von von C# eigentlich so gut wie keine Ahnung habe. Aber angeblich soll es ja ein paar Ähnlichkeiten geben, vielleicht auch bei diesem Thema?
 
Ein Dienst startet automatisch wenn er auf automatisch gestellt ist. Ist ja logisch.
Im Installerprojekt kann man festlegen ob sie automatisch starten soll oder nicht. Und auch ob sie unter SYSTEM oder NETZWERKDIENST laufen soll, oder unter irgendeinem anderen Userkonto.

Außerdem sollte man zum Installieren via Installutil die Visual Studio Kommandozeile verwenden.
Dann kann die Dienstdatei in beliebigen Verzeichnissen liegen. Evtl. gehts auch wenn man die PATH-Variable enstprechend anpasst.

Ein weiterer Fallstrick ist, dass wenn die OnStart-Methode beendet ist weil sie abgearbeitet wurde und ansonsten kein Objekt mehr läuft (Timer oder so) sich der Dienst automatisch beendet. Das sieht dann nach Fehler aus, ist aber keiner. Man muß dem Dienst halt in der Startmethode irgendwas zu tun geben.

Ich habe seinerzeit mal einen Mailserver geschrieben dessen POP3, SMTP und IMAP Komponenten jeweils als Dienst realisiert wurden. Läuft eigentlich sehr schön und rund.

Ein Setup- oder Weitergabeprojekt hab ich allerdings dafür noch nicht erstellt. Ich denke man muß dort bloß die Registryeinstellungen unter HKLM\SYSTEM\Services\(Dienstname) einfügen die Installutil generiert. Dann sollte es laufen.
 
über den registry den Dienst anmelden? Wow... hört sich einfach an, aber irgendwie unglaubwürdig. Der InstallUtil würde dann aber nicht so viel Zeit brauchen zum Installieren von Diensten oder?
 
Das Installutil ist ja nicht nur primär dafür da Dienste zu registrieren. Es registriert Assemblys im System.
Keine Ahnung was so alles dazugehört.
Wenn InstallUtil in deiner Assembly einen ServiceInstaller findet, wird er ausgeführt.

In der Registry wird dann der Dienst registriert. Unter HKLM\Services findest du ihn.
In dem jeweiligen Dienste-Key steht dann die Konfiguration drin.
- Start = Automatisch, Manuell, Deaktiviert
- DependOnService = Abhängigkeiten von anderen Diensten
- DisplayName = Wie heißt er in der Dienstesteuerung
- ImagePath = Pfad zur EXE-Datei
- ObjectName = Anmeldekonto des Dienstes

Hier gibts noch weitere Infos:
http://msdn.microsoft.com/de-de/library/zt39148a.aspx
 
Zurück
Oben