Ich habe einen Standard-.NET-Windows-Dienst in C # geschrieben.
Kann es sich selbst installieren, ohne InstallUtil zu verwenden? Soll ich die Service Installer-Klasse verwenden? Wie soll ich es benutzen?
Ich möchte folgendes anrufen können:
MyService.exe -install
Und es hat den gleichen Effekt wie das Aufrufen:
InstallUtil MyService.exe
c#
.net
deployment
windows-services
installutil
Yuval Peled
quelle
quelle
Antworten:
Ja, das ist völlig möglich (dh ich mache genau das); Sie müssen nur auf die richtige DLL (System.ServiceProcess.dll) verweisen und eine Installationsklasse hinzufügen ...
Hier ist ein Beispiel:
quelle
static void Install(bool undo, string[] args)
Definition außerhalb einer Klasse (usw.). Können Sie klarstellen, wie Sie dies umgesetzt haben?Schauen Sie sich die InstallHelper- Methode der ManagedInstaller- Klasse an. Sie können einen Dienst installieren, indem Sie:
Genau das macht InstallUtil. Die Argumente sind die gleichen wie für InstallUtil.
Die Vorteile dieser Methode bestehen darin, dass die Registrierung nicht durcheinander gebracht wird und derselbe Mechanismus wie bei InstallUtil verwendet wird.
quelle
InstallUtil
3. Sie müssen das Installationsprogramm unter x86 / x64 nicht ändern 4. es hat sich in mehreren Versionen von .Net nicht geändert - wenn ja wird es beim Testen abgeholt und ich werde es dann reparieren.Sie können jederzeit auf die guten alten WinAPI-Aufrufe zurückgreifen, obwohl der Arbeitsaufwand nicht trivial ist. Es ist nicht erforderlich, dass .NET-Dienste über einen .NET-fähigen Mechanismus installiert werden.
Installieren:
OpenSCManager
.CreateService
an, um den Dienst zu registrieren.ChangeServiceConfig2
, um eine Beschreibung festzulegen.CloseServiceHandle
.So deinstallieren Sie:
OpenSCManager
.OpenService
.DeleteService
das von zurückgegebene Handle aufrufenOpenService
.CloseServiceHandle
.Der Hauptgrund, warum ich dies der Verwendung von
ServiceInstaller
/ vorziehe,ServiceProcessInstaller
ist, dass Sie den Dienst mit Ihren eigenen benutzerdefinierten Befehlszeilenargumenten registrieren können. Sie können es beispielsweise als registrieren."MyApp.exe -service"
Wenn der Benutzer Ihre App ohne Argumente ausführt, können Sie ihm eine Benutzeroberfläche zum Installieren / Entfernen des Dienstes anbieten.Wenn Sie Reflector einschalten,
ServiceInstaller
können Sie die Details ausfüllen, die in dieser kurzen Erklärung fehlen.PS Dies hat natürlich nicht "den gleichen Effekt wie das Aufrufen von: InstallUtil MyService.exe" - insbesondere können Sie mit InstallUtil nicht deinstallieren. Aber es scheint, dass dies für Sie vielleicht keine wirklich strenge Anforderung war.
quelle
Hier ist eine Klasse, die ich beim Schreiben von Diensten verwende. Normalerweise habe ich einen interaktiven Bildschirm, der angezeigt wird, wenn der Dienst nicht aufgerufen wird. Von dort aus benutze ich die Klasse nach Bedarf. Es ermöglicht mehrere benannte Instanzen auf demselben Computer - dann das Feld InstanceID
Beispielanruf
Die Klasse selbst
quelle
GetCurrentProcess
Teil durch einen Parameter ersetzt und es erfolgreich verwendet. funktioniert super!Die obigen Beispiele haben bei mir nicht wirklich funktioniert, und der Link zum Forum als Lösung Nr. 1 ist schrecklich durchzuarbeiten. Hier ist eine Klasse, die ich (teilweise) geschrieben habe, und das andere Bit wird über diesen Link zusammengeführt, den ich irgendwo begraben gefunden habe
Führen Sie den Befehl InstallAndStart wie folgt aus, um einen Dienst zu installieren:
Stellen Sie sicher, dass das Konto, auf dem das Programm ausgeführt wird, über die Berechtigung zum Installieren von Diensten verfügt. Sie können das Programm jederzeit als Administrator ausführen.
Ich habe auch mehrere Befehle für den Nicht-API-Zugriff eingefügt, die keine Dienste installieren oder entfernen, aber Sie können sie auflisten und mehrere steuern (Start, Stopp, Neustart). Sie müssen wirklich nur die Berechtigungen zum Installieren oder Entfernen von Diensten erhöhen.
Es gibt auch einige Befehle zum Abrufen und Festlegen von Umgebungsvariablen, z. B.
OPENSSL_CONF
oderTEMP
. Zum größten Teil sollten die Parameter und Methodennamen ziemlich selbsterklärend sein.quelle
Unknown = -1, NotFound = 0, Stopped = 1, StartPending = 2, StopPending = 3, Running = 4
Wenn Sie versuchen, eine Befehlszeilenanwendung als Windows-Dienst zu installieren , verwenden Sie das Dienstprogramm ' NSSM '. Verwandte ServerFault-Details finden Sie hier .
quelle
quelle