2010-11-30 16 views
2

Il y a beaucoup d'exemples comment installer service Windows en une ligne:Windows .Net services: installation de l'assemblage référencé

ManagedInstallClass.InstallHelper(
     new[] { Assembly.GetExecutingAssembly().Location }); 

Cela fonctionne bien jusqu'à ce que la classe de service est déclaré dans le module exe. Mais le même code ne fonctionne pas pour moi si la classe de service est dans l'assembly référencé (non déclaré dans l'exécutable, mais dans la DLL liée). Dans ce cas, le service est également enregistré mais ne peut pas être démarré car il est enregistré avec dll path et points to dll (le message "le service n'est pas un exécutable win32" apparaît dans le journal des événements lorsque j'essaie de le démarrer).

Si je change GetExecutingAssembly().Location en chemin exécutable, aucun programme d'installation n'est trouvé et le service n'est pas enregistré du tout.

Est-il possible de placer la classe de service dans l'assembly référencé et de toujours pouvoir enregistrer le service avec un minimum d'effort?

Merci d'avance!

Répondre

3

ici est un code C# qui vous permet d'installer/désinstaller un service « manuellement » (sans la nécessité de déclarer les attributs personnalisés RunInstaller):

static void InstallService(string path, string name, string displayName, string description) 
{ 
    ServiceInstaller si = new ServiceInstaller(); 
    ServiceProcessInstaller spi = new ServiceProcessInstaller(); 
    si.Parent = spi; 
    si.DisplayName = displayName; 
    si.Description = description; 
    si.ServiceName = name; 
    si.StartType = ServiceStartMode.Manual; 

    // update this if you want a different log 
    si.Context = new InstallContext("install.log", null); 
    si.Context.Parameters["assemblypath"] = path; 

    IDictionary stateSaver = new Hashtable(); 
    si.Install(stateSaver); 
} 

static void UninstallService(string name) 
{ 
    ServiceInstaller si = new ServiceInstaller(); 
    ServiceProcessInstaller spi = new ServiceProcessInstaller(); 
    si.Parent = spi; 
    si.ServiceName = name; 

    // update this if you want a different log 
    si.Context = new InstallContext("uninstall.log", null); 
    si.Uninstall(null); 
}