4个答案
创建Windows控制台应用程序,然后 在Program.cs中,更准确地说,在Main函数中,您可以测试是否存在“/console”参数 如果有“/console”,则正常启动程序 如果参数不存在,请从ServiceBase调用Service类
//表示应用程序的服务版本的类 公共类服务示例:ServiceBase { protected override void OnStart(字符串[]参数) { //在此处运行服务版本 //注意:如果您的任务与大多数任务一样长时间运行 //应该在工作线程上调用它的服务 // !!! 不要在这个函数中花费太长时间!!! 底座。 OnStart(参数); } 受保护的覆盖void OnStop() { //此处显示停止服务代码 底座。 OnStop(); } }
静态类程序 { //应用程序的主要入口点。 static void Main(字符串[]参数) { ServiceBase[]要运行的服务;
if((args.Length>0)&&(args[0]=“/console”) { //在此处运行控制台版本 } 其他的 { ServicesToRun=新ServiceBase[]{新serviceSample()}; 服务库。 运行(ServicesToRun); } }
}
static void Main(字符串[]参数) { 如果(args==“blah”) { 我的服务(); } 其他 { 系统。 服务流程。 ServiceBase[]要运行的服务; ServicesToRun=新系统。 服务流程。 ServiceBase[]{new MyService()}; 系统。 服务流程。 服务库。 运行(ServicesToRun); }
-
我也一直在考虑这个问题,是的,但我有一个web应用程序,一堆SQL作业,一堆Windows服务,一堆命令行工具,现在还有一堆被用作计划任务的工具。。。。 实际上,我正在尝试减少我需要处理和管理的不同类型的事情的数量。 无论如何,感谢您的输入! – 马克 评论 2009年4月30日21:24 -
我已经成功地创建了可以从命令行运行的应用程序,也可以作为windows服务安装和运行,但我同意@Mark Ransom的观点,至少他们是非常不同的动物,你必须小心实现,尤其是服务。 就像我在示例中的代码注释中提到的那样,不要从OnStart事件处理程序运行任何阻塞任务。 相反,在单独的线程或类似的异步构造上启动服务! – 迈克·迪内斯库 评论 2009年4月30日21:35