J'ai un service Windows .NET standard écrit en C #.
Peut-il s'installer sans utiliser InstallUtil? Dois-je utiliser la classe du programme d'installation du service? Comment dois-je l'utiliser?
Je souhaite pouvoir appeler:
MyService.exe -install
Et cela aura le même effet que d'appeler:
InstallUtil MyService.exe
c#
.net
deployment
windows-services
installutil
Yuval Peled
la source
la source
Réponses:
Oui, c'est tout à fait possible (c'est-à-dire que je fais exactement cela); il vous suffit de référencer la bonne dll (System.ServiceProcess.dll) et d'ajouter une classe d'installation ...
Voici un exemple:
la source
static void Install(bool undo, string[] args)
définition extérieure à une classe (etc.). Pouvez-vous clarifier comment vous avez mis cela en œuvre?Jetez un œil à la méthode InstallHelper de la classe ManagedInstaller . Vous pouvez installer un service en utilisant:
C'est exactement ce que fait InstallUtil. Les arguments sont les mêmes que pour InstallUtil.
Les avantages de cette méthode sont qu'elle n'implique aucune erreur dans le registre et qu'elle utilise le même mécanisme que InstallUtil.
la source
InstallUtil
fait 3. vous n'avez pas besoin de changer le programme d'installation sur x86 / x64 4. cela n'a pas changé dans plusieurs versions de .Net - si c'est le cas , il sera repris lors des tests et je le réparerai ensuite.Vous pouvez toujours revenir aux bons vieux appels WinAPI, bien que la quantité de travail impliquée ne soit pas anodine. Il n'est pas nécessaire que les services .NET soient installés via un mécanisme compatible .NET.
À installer:
OpenSCManager
.CreateService
pour enregistrer le service.ChangeServiceConfig2
pour définir une description.CloseServiceHandle
.Pour désinstaller:
OpenSCManager
.OpenService
.DeleteService
le handle retourné parOpenService
.CloseServiceHandle
.La principale raison pour laquelle je préfère cela à l'utilisation de
ServiceInstaller
/ServiceProcessInstaller
est que vous pouvez enregistrer le service avec vos propres arguments de ligne de commande personnalisés. Par exemple, vous pouvez l'enregistrer en tant que"MyApp.exe -service"
, puis si l'utilisateur exécute votre application sans aucun argument, vous pouvez lui proposer une interface utilisateur pour installer / supprimer le service.Exécution du réflecteur sur
ServiceInstaller
peut remplir les détails manquants dans cette brève explication.PS Il est clair que cela n'aura pas "le même effet que d'appeler: InstallUtil MyService.exe" - en particulier, vous ne pourrez pas désinstaller avec InstallUtil. Mais il semble que ce n'était peut-être pas une exigence rigoureuse pour vous.
la source
Voici une classe que j'utilise lors de l'écriture de services. J'ai généralement un écran interactif qui s'affiche lorsque le service n'est pas appelé. De là, j'utilise la classe au besoin. Il permet plusieurs instances nommées sur la même machine - d'où le champ InstanceID
Exemple d'appel
La classe elle-même
la source
GetCurrentProcess
pièce par un paramètre et l' ai utilisée avec succès. fonctionne très bien!Les exemples ci-dessus n'ont pas vraiment fonctionné pour moi, et le lien vers le forum en tant que solution n ° 1 est horrible à explorer. Voici une classe que j'ai écrite (en partie), et l'autre partie est fusionnée à partir de ce lien que j'ai trouvé enterré quelque part
Pour installer un service, exécutez la commande InstallAndStart comme suit:
Assurez-vous que le compte qui exécute le programme est autorisé à installer des services. Vous pouvez toujours «Exécuter en tant qu'administrateur» sur le programme.
J'ai également inclus plusieurs commandes pour un accès non api qui n'installent ni ne suppriment de services, mais vous pouvez les répertorier et en contrôler plusieurs (démarrer, arrêter, redémarrer). Vous n'avez vraiment besoin d'élever que les autorisations pour installer ou supprimer des services.
Il existe également quelques commandes permettant d'obtenir et de définir des variables d'environnement, telles que
OPENSSL_CONF
ouTEMP
. Pour la plupart, les paramètres et les noms de méthode devraient être assez explicites.la source
Unknown = -1, NotFound = 0, Stopped = 1, StartPending = 2, StopPending = 3, Running = 4
Dans le cas où vous essayez d'installer une application de ligne de commande en tant que service Windows, essayez l' utilitaire « NSSM ». Détails ServerFault associés trouvés ici .
la source
la source