2013-02-21 12 views
18

मैं कंसोल ऐप में कुछ कस्टम तर्कों को पास करना चाहता हूं जब मैं इसे स्थापित करता हूं और इसे टॉपशेल्फ़ के माध्यम से विंडोज सेवा के रूप में शुरू करता हूं।मैं कमांडलाइन तर्कों का उपयोग कैसे कर सकता हूं जिन्हें TopShelf द्वारा पहचाना नहीं गया है?

जब मैं का उपयोग करें:

MyService install start /fooBar: Test 

कंसोल आवेदन में विफल रहता है:

[विफलता] कमांड लाइन एक अनजान कमांड लाइन विकल्प मिला था: परिभाषित करें: foobar = टेस्ट

प्रश्न:

मैं अपने तर्कों को टॉपशेल्फ़ द्वारा पहचानने योग्य कैसे बना सकता हूं ताकि मैं उनके मूल्यों का उपभोग कर सकूं?

उत्तर

29

संपादित करें: यह केवल .exe चलाते समय काम करता है, सेवा के रूप में नहीं चलते समय। एक विकल्प के रूप में आप एक विन्यास मूल्य के रूप में विकल्प जोड़ने और स्टार्ट-अप पर इसे पढ़ा (जो शायद बेहतर अभ्यास वैसे भी है) कर सकते हैं:

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

प्रलेखन आप इस में आदेश निर्दिष्ट करने की आवश्यकता के अनुसार पैटर्न:

-foobar:Test 

आप भी अपनी सेवा विन्यास में परिभाषा जोड़ने की जरूरत:

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() से पहले और // कुछ करने के बाद आपको निम्न पंक्ति जोड़ने की आवश्यकता है: configurator.ApplyCommandLine(); – Todd

+1

क्या आप ServiceClass पर कमांडलाइन तर्क जोड़ सकते हैं? मैं ऐसा करने की कोशिश कर रहा हूं, लेकिन जब मैं इसे सेवा के रूप में शुरू करता हूं तो यह काम नहीं करेगा। – fuLLMetaLMan

+0

हां। यह सेवा के रूप में स्थापित/शुरू करते समय काम नहीं कर रहा है। foobar खाली है। @fuLLMetaLMan: क्या आपको कोई जवाब मिला? –

संबंधित मुद्दे

 संबंधित मुद्दे