2013-03-06 15 views
8

Utilizzo gli argomenti della riga di comando per passare alcune configurazioni al servizio Windows (saranno poche istanze con diverse righe di comando).Come specificare le opzioni della riga di comando per il servizio in TopSh

Il mio codice è simile al seguente:

HostFactory.Run(x =>         
{ 
    x.Service<MyHost>(s => 
    {      
     s.ConstructUsing(name => new MyHost()); 
     s.WhenStarted(tc => tc.Start());    
     s.WhenStopped(tc => tc.Stop());    
    }); 
    x.AddCommandLineDefinition("sqlserver", v => sqlInstance = v); 
}); 

Quando si installa il servizio che uso:

myhost.exe install -sqlserver:someinstance 

Purtroppo, sqlserver opzioni della riga di comando è disponibile solo su installazione di fase, e non vanno al parametri del servizio. Quindi quando eseguo il servizio, non ottengo il valore di parametro che mi serve.

C'è un modo per modificare la riga di comando del servizio avviato da TopShelf?

risposta

2

Non è possibile modificare la riga di comando passato al servizio. Mi aggiro salvando quei parametri per la configurazione vicino all'exe. Quindi, un utente può fare questo:

service.exe run /sqlserver:connectionstring 

e l'applicazione salva il connectionstring in un file (sia utilizzando System.IO.File o utilizzando ConfigurationManager)

Quindi, se l'utente fa questo:

service.exe run 

Oppure, se il servizio viene eseguito come servizio di Windows, l'app viene caricata dalla configurazione.

3

Ho un requisito simile e purtroppo la memorizzazione dei parametri della riga di comando in un file non era un'opzione.

responsabilità: questo approccio è valido solo per Windows

Prima ho aggiunto un After Install Action

x.AfterInstall(
    installSettings => 
    { 
     AddCommandLineParametersToStartupOptions(installSettings); 
    }); 

In AddCommanLineParameterToStartupOptions aggiorno il ImagePath voce di registro di Windows per il servizio per includere la riga di comando parametri.

TopShelf aggiunge i parametri dopo questo passaggio in modo da evitare i duplicati di servicename e instance I filtri. Si consiglia di filtrare più di quelli solo, ma nel mio caso questo è stato sufficiente.

 private static void AddCommandLineParametersToStartupOptions(InstallHostSettings installSettings) 
    { 
      var serviceKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
       $"SYSTEM\\CurrentControlSet\\Services\\{installSettings.ServiceName}", 
       true); 

      if (serviceKey == null) 
      { 
       throw new Exception($"Could not locate Registry Key for service '{installSettings.ServiceName}'"); 
      } 

      var arguments = Environment.GetCommandLineArgs(); 

      string programName = null; 
      StringBuilder argumentsList = new StringBuilder(); 

      for (int i = 0; i < arguments.Length; i++) 
      { 
       if (i == 0) 
       { 
        // program name is the first argument 
        programName = arguments[i]; 
       } 
       else 
       { 
        // Remove these servicename and instance arguments as TopShelf adds them as well 
        // Remove install switch 
        if (arguments[i].StartsWith("-servicename", StringComparison.InvariantCultureIgnoreCase) | 
         arguments[i].StartsWith("-instance", StringComparison.InvariantCultureIgnoreCase) | 
         arguments[i].StartsWith("install", StringComparison.InvariantCultureIgnoreCase)) 
        { 
         continue; 
        } 
        argumentsList.Append(" "); 
        argumentsList.Append(arguments[i]); 
       } 
      } 

      // Apply the arguments to the ImagePath value under the service Registry key 
      var imageName = $"\"{Environment.CurrentDirectory}\\{programName}\" {argumentsList.ToString()}"; 
      serviceKey.SetValue("ImagePath", imageName, Microsoft.Win32.RegistryValueKind.String); 
} 
Problemi correlati