2010-01-26 7 views
1

Je construis un framework for building scheduling services réutilisable en utilisant le .NET Framework. Mon code est distribué sous la forme d'une bibliothèque, qui est ensuite référencée par l'utilisateur dans une application console. Dans le point d'entrée principal de l'application, l'utilisateur est invité à transférer le contrôle à une méthode statique dans la bibliothèque, qui commencera la planification du travail s'il fonctionne en mode non interactif, lire les arguments de commande et effectuer des tâches de maintenance telles que l'installation. Pour installer l'application en tant que service Windows à l'aide de l'espace de noms System.Configuration.Install, l'utilisateur devra ajouter un descendant de classe de Installer à l'assembly d'application, indiquant au framework comment installer le service. Je préférerais vraiment le faire une fois pour toutes dans la bibliothèque, mais malheureusement la classe d'installateur a pour être dans l'assemblage de l'application. La solution que je regarde en ce moment, consiste à définir une classe d'installateur dans la bibliothèque, et demander à l'utilisateur d'en hériter dans une classe publique, sans ajouter de code supplémentaire. Pendant que cela fonctionne, l'utilisateur doit écrire un code de plaque de chaudière ennuyeux.Comment installer le service Windows sans étendre le programme d'installation?

Quelles sont les alternatives à l'extension Installer? Puis-je accéder au framework d'installation géré de manière plus directe?

Répondre

3

J'utilise SC.exe pour enregistrer le binaire de service.

cela laisse que ce talon dans la classe d'installation de service:

[RunInstaller(true)] 
public partial class SoapSenderInstaller : Installer 
{ 
    public SoapSenderInstaller() 
    { 
     InitializeComponent(); 
    } 
} 

Appel SC.exe est une simple que cela:

sc create MyService binpath= "C:\Path\to\my\MyService.exe" DisplayName= "My Service Display Name" depend= MSMQ start= auto 

Le seul écueil est la façon sc.exe attend ses arguments de ligne de commmand:

binpath=[BLANK]"MyService.exe" 

EDIT

Bien sûr, cette solution ne permet pas à l'utilisateur de créer un code qui fasse de son binaire un service Windows car s'il fait simplement référence à votre bibliothèque, il devra hériter de ServiceBase et implémenter OnStart() et OnStop().

+0

La classe d'installateur devrait encore résider dans l'ensemble d'entrée, pas dans une bibliothèque référencée, non? –

+0

Oui, la classe d'installation réside dans l'ensemble d'entrée mais est pratiquement vide. Je n'ai pas encore essayé de compléter omettre le programme d'installation mais peut-être même que cela serait possible car c'est seulement nécessaire par InstallUtil. – Filburt

+0

Notez que "sc.exe" n'est pas disponible dans Win2000 (pas dans l'installation par défaut, mais peut être installé avec certains tool-kit de MS) – kibab

0

Je sais que vous pouvez ajouter des champs personnalisés au programme d'installation et demander l'intervention de l'utilisateur lors de l'installation si vous le compilez à l'aide de Installer.CodeEffects.com. Peut-être, en exigeant un espace de noms ou un nom de type comme une entrée de chaîne de l'utilisateur final, vous pouvez charger ou invoquer des choses dont vous avez besoin à la volée au moment de l'exécution?

Je ne peux pas penser à autre chose dans votre situation.

Questions connexes