2013-02-21 21 views
18

Chcę przekazać pewne niestandardowe argumenty do aplikacji konsoli po zainstalowaniu i uruchomieniu go jako usługi systemu Windows za pośrednictwem TopShelf.Jak używać argumentów CommandLine, które nie są rozpoznawane przez TopShelf?

Gdy używam:

MyService install start /fooBar: Test 

aplikacji konsoli kończy się niepowodzeniem:

[Błąd] Command Line Nieznana opcja wiersza polecenia stwierdzono: określić: foobar = test

Pytanie:

Jak mogę sprawić, aby moje argumenty były rozpoznawalne na TopShelf, aby móc konsumować ich wartości?

Odpowiedz

29

EDYCJA: Działa tylko podczas uruchamiania .exe, a nie podczas pracy jako usługa. Jako alternatywę można dodać opcję jako wartość konfiguracji i odczytać go przy rozruchu (co jest prawdopodobnie lepsza praktyka i tak):

using System.Configuration; 

// snip 

string foobar = null; 

HostFactory.Run(configurator => 
{ 
    foobar = ConfigurationManager.AppSettings["foobar"]; 

    // do something with fooBar 

    configurator.Service<ServiceClass>(settings => 
    { 
     settings.ConstructUsing(s => GetInstance<ServiceClass>()); 
     settings.WhenStarted(s => s.Start()); 
     settings.WhenStopped(s => s.Stop()); 
    }); 

    configurator.RunAsLocalService(); 
    configurator.SetServiceName("ServiceName"); 
    configurator.SetDisplayName("DisplayName"); 
    configurator.SetDescription("Description"); 
    configurator.StartAutomatically(); 
}); 

Zgodnie z dokumentacją trzeba określić polecenia w tym wzór:

-foobar:Test 

trzeba także dodać definicję w konfiguracji usług:

string fooBar = null; 

HostFactory.Run(configurator => 
{ 
    configurator.AddCommandLineDefinition("fooBar", f=> { fooBar = f; }); 
    configurator.ApplyCommandLine(); 

    // do something with fooBar 

    configurator.Service<ServiceClass>(settings => 
    { 
     settings.ConstructUsing(s => GetInstance<ServiceClass>()); 
     settings.WhenStarted(s => s.Start()); 
     settings.WhenStopped(s => s.Stop()); 
    }); 

    configurator.RunAsLocalService(); 
    configurator.SetServiceName("ServiceName"); 
    configurator.SetDisplayName("DisplayName"); 
    configurator.SetDescription("Description"); 
    configurator.StartAutomatically(); 
}); 
+3

Po AddCommandLineDefinition() i przed // należy coś dodać, aby dodać następujący wiersz: configurator.ApplyCommandLine(); – Todd

+1

Czy możesz dodać argument polecenia do ServiceClass? Próbuję to zrobić, ale nie będzie działać, gdy uruchomię go jako usługę. – fuLLMetaLMan

+0

Tak. To nie działa podczas instalowania/uruchamiania go jako usługi. foobar jest pusty. @fuLLMetaLMan: Czy znalazłeś odpowiedź? –