2015-09-28 3 views
0

установить службы Windows с помощью следующего кода:служба реестр Windows, как остановленный

ServiceBase.Run(new ServiceProcess(serviceName, serviceArgs)); 

От documentation я вижу, что этот метод также называют OnStart метод на службу. Но я хочу установить службу как остановленную, а затем запустить ее вручную.

+0

Что делать, если вы прекратите обслуживание после установки? это сработает для вас? – Viru

+0

@Viru это вариант, но я боюсь, что служба может сделать некоторые действия до остановки, что не подходит для моего приложения. Поэтому я пытаюсь найти решение, чтобы избежать этого. – Backs

+0

Я получил его, но в этом случае вам нужно переопределить метод onStart и предоставить свою собственную реализацию, где вы можете проверить, запущен ли он в первый раз, если да, то не называть начало – Viru

ответ

0

Я исследовал наш проект и нашел установщик. Я переопределил метод OnCommitted и проверил параметр Delayed, чтобы начать обслуживание сейчас или сделать это позже вручную.

[RunInstaller(true)] 
public class CustomInstaller : System.Configuration.Install.Installer 
{ 
    public CustomInstaller() 
    { 
     _installProcess = new ServiceProcessInstaller { Account = ServiceAccount.NetworkService }; 
     _installService = new CustomServiceInstaller(typeof(ServiceImplementation)); 

     // Remove built-in EventLogInstaller: 
     _installService.Installers.Clear(); 

     Installers.Add(_installProcess); 
     Installers.Add(_installService); 
    } 

    public override void Install(IDictionary stateSaver) 
    { 
     //install 
     base.Install(stateSaver); 
    } 

    protected override void OnCommitted(IDictionary savedState) 
    { 
     var delyed = bool.Parse(GetContextParameter(@"Delayed")); 

     if (!delyed) 
     { 
      new ServiceController(GetContextParameter(ServiceNameKey)).Start(); 
     } 
    } 

    private string GetContextParameter(string parameterKey) 
    { 
     var parameterValue = Context.Parameters[parameterKey]; 
     if (string.IsNullOrWhiteSpace(parameterValue)) 
      throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, MissingRequiredParameterErrorMessage, parameterKey)); 
     return parameterValue; 
    } 
} 
0
private static InitialStartDone = false; // declared in service class 
protected Overrride void OnStart(string[] args); 
{ 
    if(!InitialStartDone) 
    { 
     InitialStartDone = true; 
    } 
    else 
    { 
     base.OnStart(args); 
    } 
} 

Попробуйте переопределение поведения по умолчанию при запуске и использовать статические переменный, чтобы обнаружить, если он называется первым разом

+0

спасибо, я проверю его позже и скажу вам результаты – Backs

+0

Я не думаю, что это сработает. ** Каждый раз, когда вы запускаете службу, InitialStartDone будет ложным, и, следовательно, сервис никогда не запустится! – sgmoore

+0

Я немного перезагружаюсь, а метод «OnStart» слишком поздний, сервис уже запущен. Ниже я опубликовал решение, которое работает для меня. – Backs

Смежные вопросы