我有一个我编写的Windows窗体应用程序,可以监视收件箱和数据库。客户告诉我,每次服务器重新启动时都需要运行。让我感到羞耻的是让客户改变了要求。
我在想...有没有办法让Windows Forms应用程序作为服务运行,以便它自动启动?
澄清
我想尝试不再编写任何代码......如果可能的话!
答案 0 :(得分:8)
查看此文章:http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=719&av=49654
这是一篇非常古老的文章,但它已经工作了8年,并且作者继续保持最新状态。
它会做你想做的事。
答案 1 :(得分:5)
如果您确定该应用程序可以无人值守地安全运行(我的意思是它可以 从不 抛出一个模式UI元素,如消息框)并且它没有' t需要任何交互,直到关闭,它将被终止,然后将其作为计划任务运行,并将触发器设置为系统启动。
如果它可以无人值守运行但可能需要手动关闭和重启,或者它不能在关机时终止,那么按照EnocNRoll的建议使用XYNTService。这是一个可怕的黑客,但它会适合你想要的。
但到目前为止,最好的解决方案是将程序的功能与用户界面分开,并编写适当的服务。对于生产服务器,我不允许任何其他内容。如果不容易分开,那么你有一些设计问题,无论如何都要考虑。
答案 2 :(得分:1)
您可以将winforms应用程序作为服务运行,您将无法看到它 - 它将显示在所谓的虚拟桌面上,无法在您的显示器上查看。
答案 3 :(得分:1)
答案 4 :(得分:0)
考虑到这一点的唯一方法是确保应用程序没有UI元素,因为你必须跳过非Vista机器上的箍来使这个工作,而在Vista上,你不能完全与桌面交互。
相反,您最好将功能重构为一组共享库,然后创建使用这些库的服务,并在客户端安装。
答案 5 :(得分:0)
如果在表单应用程序中有一个很好的解耦功能,那么使用其安装程序创建服务类应该很简单,然后在服务的OnStart方法中启动处理器类:
protected override void OnStart(string[] args)
{
Processor processor = new Processor();
Thread workerThread = new Thread(processor.OnStart);
workerThread.IsBackground = true;
try
{
workerThread.Start();
}
catch
{
//...
}
}
答案 6 :(得分:0)
您可以使用InstallUtil将您的应用安装为服务,但您需要确保它不依赖于GUI,我建议您更改应用的启动,以便它不会尝试创造任何形式。
答案 7 :(得分:-1)
发现此article名为如何创建用户定义的服务。