質問

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つのことをしようとしない方が良いでしょう。

代わりにスケジュールされたタスクにすることを検討しましたか?

Windowsサービスとスケジュールされたタスク

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top