未登录时运行Windows程序

时间:2012-02-29 21:32:51

标签: c#-4.0 windows-services windows-server-2003

我最近对Windows有了“重新认识”,而且我也是.NET& S的新手。 C#。我正试图找出一种在Windows 2003机器上运行程序的方法(即,当没有人登录并且在服务器启动时自动启动时它会运行)。我想我的问题太复杂了,让自己陷入困境。

这个名为Job.exe的程序通常在GUI中运行,但我可以选择从命令行运行参数。

由于“永远在线”部分,首先想到的是创建服务。可笑的是,我已经陷入了如何从我的Service1.cs文件中运行可执行文件(Job.exe)的困难(我是否提到我是c#的新手?)。

关于创建服务我还有其他一些观点是如何/在何处配置桌面交互,因为我希望Job.exe完全在后台运行。此外,由于OnStart应该在完成时返回操作系统,我对于应该将代码放在何处执行程序感到困惑;我可以将其放在我的OnStart方法中,还是创建一个我从OnStart调用的方法?

有关创建服务的最后一个问题是关于参数。 Job.exe总共接受两个参数,一个是静态的,一个是动态的(即可以通过服务管理控制台中的服务属性对话框定义)。我希望能够创建服务的多个实例,为每个实例指定不同的动态参数。此外,动态参数应该能够接受字符串数组。

我确信在创建服务之外还有其他选择,所以我会接受任何建议。

2 个答案:

答案 0 :(得分:3)

由于您提到您可能会使问题过于复杂,因此您可以考虑使用任务计划程序来运行您的应用程序。

使用任务计划程序将允许您创建“常规”桌面应用程序,这可能比创建自己的服务更简单。此外,任务计划程序有许多选项符合您的要求。

答案 1 :(得分:1)

最简单的方法可能是创建服务,引用应用程序的程序集,并调用它的Main()方法来启动应用程序。应用程序本身可以使用Environment.UserInteractive来检测它是作为服务还是作为桌面应用程序运行。

正如您所提到的,有一点需要注意的是,服务的Start方法(以及其他控制方法)应该立即返回ish(在“Starting Service ...”对话框的时间范围内)所以你需要启动一个线程来运行main方法。像这样:

Thread t = new Thread(() => { MyApplication.Application.Main("firstParam", "secondParam"); });
t.Start();

params可能来自一个文件,并且可以使用文件名作为参数配置服务(有关如何执行此操作的许多示例之一,请参阅this article),或者可以将服务配置为您提到参数并将它们传递给应用程序的main方法。这些都是可行的方法。无论哪种方式,一次只能运行一个服务实例,因此您需要使用不同的名称多次注册服务以配置不同的参数。