2013-02-21 3 views
18

TopShelf経由でWindowsサービスとしてインストールして起動するときに、コンソールアプリケーションにカスタム引数を渡したいと思っています。TopShelfで認識されないCommandLine引数はどのように使用できますか?

私が使用している場合:

MyService install start /fooBar: Test 

コンソールアプリケーションに障害が発生した:

[失敗]コマンドラインのアン不明なコマンドラインオプションが見つかった: はDEFINE:fooBarに=テストを

質問:

自分の値を消費できるように、私の議論をTopShelfが認識できるようにするにはどうすればよいですか?

答えて

29

EDIT:これは、サービスとして実行しているときではなく、.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

はい。これは、サービスとしてインストール/開始するときには機能しません。 foob​​arは空です。 @fuLLMetaLMan:あなたは答えを見つけましたか? –