コンボコマンドライン/ Windowsサービスアプリを作成する
-
03-07-2019 - |
質問
C#で、コマンドラインから実行して出力を生成(またはファイルに書き込み)できるユーティリティアプリをセットアップするのに最適な方法は何ですか?ただし、Windowsサービスとしても実行してジョブを実行できますバックグラウンドで(たとえば、ディレクトリの監視など)。
コードを1回作成して、PowerShellまたは他のCLIから対話的に呼び出すことができますが、同時にWindowsサービスとして同じEXEファイルをインストールして無人で実行する方法も見つけたいと思います。
これを行うことはできますか?もしそうなら:どのようにこれを行うことができますか?
解決
はい、できます。
これを行う1つの方法は、コマンドラインパラメーター、たとえば" / console"を使用して、コンソールバージョンとサービスバージョンとしての実行を区別することです。
- Windowsコンソールアプリを作成してから
- Program.cs、より正確にはMain関数で、「/ console」の存在をテストできます。 param
- " / console"の場合そこにある場合、プログラムを正常に開始します
- パラメータが存在しない場合、ServiceBaseからServiceクラスを呼び出します
// Class that represents the Service version of your app
public class serviceSample : ServiceBase
{
protected override void OnStart(string[] args)
{
// Run the service version here
// NOTE: If you're task is long running as is with most
// services you should be invoking it on Worker Thread
// !!! don't take too long in this function !!!
base.OnStart(args);
}
protected override void OnStop()
{
// stop service code goes here
base.OnStop();
}
}
...
次にProgram.csで:
static class Program
{
// The main entry point for the application.
static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
if ((args.Length > 0) && (args[0] == "/console"))
{
// Run the console version here
}
else
{
ServicesToRun = new ServiceBase[] { new serviceSample () };
ServiceBase.Run(ServicesToRun);
}
}
}
他のヒント
設計の観点からこれを達成する最良の方法は、ライブラリプロジェクトにすべての機能を実装し、その周りに個別のラッパープロジェクトを構築して、希望する方法(つまり、Windowsサービス、コマンドラインプログラム、asp)を実行することですネットWebサービス、wcfサービスなど)
はい、できます。
スタートアップクラスはServiceBaseを拡張する必要があります。
静的void Main(string [] args)スタートアップメソッドを使用して、コンソールモードで実行するコマンドラインスイッチを解析できます。
次のようなもの:
static void Main(string[] args)
{
if ( args == "blah")
{
MyService();
}
else
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyService() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
Windowsサービスは、通常のWindowsプログラムとはまったく異なります。一度に2つのことをしようとしない方が良いでしょう。
代わりにスケジュールされたタスクにすることを検討しましたか?