2010-11-30 2 views
2

Там много примеров, как установить окно службу в одной строке:.Net окно услуги: установка из ссылочного сборки

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

Это прекрасно работает до тех пор, пока класс обслуживания объявлено в модуле EXE. Но тот же код не работает для меня, если класс службы находится в сборке ссылок (не объявлен в исполняемом файле, а в связанной DLL).

В таком случае служба также зарегистрирована, но не может быть запущена, поскольку она зарегистрирована в DLL-пути и указывает на DLL (сообщение «service is not a win32 executable») появляется в журнале событий, когда я пытаюсь запустить этот)

Если я изменю GetExecutingAssembly().Location на исполняемый путь, то ни один инсталлятор не обнаружен, и сервис не зарегистрирован вообще.

Можно ли поставить класс обслуживания в ссылочную сборку и все еще иметь возможность регистрировать обслуживание с минимальными усилиями?

Спасибо заранее!

ответ

3

здесь некоторые C# код, который позволяет установить/удалить услугу «вручную» (без необходимости объявить пользовательские 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); 
}