2013-02-21 20 views
18

TopShelf aracılığıyla bir Windows Hizmeti olarak kurup başlattığımda konsol uygulamasına bazı özel argümanlar iletmek istiyorum.TopShelf tarafından tanınmayan CommandLine Argümanlarını nasıl kullanabilirim?

Ben kullandığınızda:

MyService install start /fooBar: Test 

Konsol uygulaması başarısız:

[Başarısızlık] Komut Satırı Bilinmeyen bir komut satırı seçeneği bulunmuştur: DEFINE: filanca = Testi

Soru:

Değerlerimi tüketebilmek için argümanlarım TopShelf tarafından tanınabilmeyi nasıl sağlayabilirim?

cevap

29

DÜZENLEME: Bu yalnızca bir .exe hizmetini çalıştırırken değil, çalışırken çalıştırılır. Alternatif olarak bir yapılandırma değeri olarak seçeneğini ekleyebilirsiniz ve (muhtemelen daha iyi bir uygulama zaten olan) Başlangıçta okumak:

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(); 
}); 

bu komutları belirtmek gerekir belgelere göre desen:

-foobar:Test 
Ayrıca servis yapılandırmasında tanımını eklemek gerekir

:

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

AddCommandLineDefinition() 'dan sonra ve/veya aşağıdaki satırı eklemeniz gereken bir şey yapmadan önce: configurator.ApplyCommandLine(); – Todd

+1

ServiceClass'a bir komut satırı bağımsız değişkeni ekleyebilir misiniz? Bunu yapmaya çalışıyorum, ancak bir hizmet olarak başladığımda çalışmaz. – fuLLMetaLMan

+0

Evet. Bu, hizmet olarak kurulurken/başlatıldığında çalışmıyor. foobar boş. @fuLLMetaLMan: Bir cevap buldunuz mu? –

İlgili konular