创建一个组合命令行/ Windows服务应用程序

时间:2009-04-30 21:06:54

标签: c# .net command-line windows-services

在C#中设置可以从命令行运行并生成一些输出(或写入文件)的实用程序应用程序的最佳方法是什么,但这可以作为Windows服务运行以完成其工作在后台(例如监控目录或其他)。

我想编写一次代码并能够从PowerShell或其他CLI以交互方式调用它,但同时也找到了一种方法来安装与Windows服务相同的EXE文件并使其无人值守

我可以这样做吗?如果是这样的话:我怎么能这样做?

4 个答案:

答案 0 :(得分:18)

是的,你可以。

这样做的一种方法是使用命令行参数,比如说“/ console”,告诉控制台版本除了作为服务版本运行之外:

  • 创建Windows控制台应用程序,然后
  • 在Program.cs中
  • ,更准确地说,在Main函数中,您可以测试“/ console”param的存在
  • 如果有“/ console”,则正常启动该程序
  • 如果param不存在,则从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);
    }
}

}

答案 1 :(得分:4)

从设计角度来看,实现这一目标的最佳方法是在库项目中实现所有功能,并围绕它构建单独的包装器项目以执行您想要的方式(即Windows服务,命令行程序,asp。网络服务,wcf服务等。)

答案 2 :(得分:3)

是的,可以做到。

您的启动类必须扩展ServiceBase。

您可以使用static 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);
   }

答案 3 :(得分:1)

Windows服务与普通的Windows程序完全不同;你最好不要一次做两件事。

您是否考虑过将其作为预定任务?

windows service vs scheduled task