[英]Run Windows Forms application as service?
我有一个我编写的 Windows 窗体应用程序,它对收件箱和数据库进行一些监视。 客户告诉我它需要在每次服务器重新启动时运行。 让客户改变要求让我感到羞耻。
我在想……有没有办法让 Windows 窗体应用程序作为服务运行,以便它自动启动?
澄清
我想尽量不用再写任何代码......如果可能的话!
(此答案已过时,因为链接的文章已于 2012 年删除。但是,StackOverflow 不允许删除已接受的答案。因此,请不要低估此答案,因为我已通知您它已过时。)
替代链接: https : //web.archive.org/web/20111221041348/http : //www.codeproject.com/kb/system/xyntservice.aspx
C++ 源代码(或使用文章中的浏览代码选项卡): https : //web.archive.org/web/20111228050501/http : //www.codeproject.com/KB/system/xyntservice.aspx
不幸的是,Zip 文件源代码下载在替代链接中不起作用。
看看这篇文章: http : //www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=719&av=49654
这是一篇非常古老的文章,但它已经工作了 8 年,并且作者仍在不断更新。
它会做你想做的事。
如果您确定应用程序可以在无人看管的情况下安全地运行(我的意思是它永远不会抛出像消息框这样的模式 UI 元素)并且它在关闭之前不需要任何交互,在关闭时它会简单地终止,然后运行它作为触发器设置为系统启动的计划任务。
如果它可以无人值守运行,但可能需要手动关闭并重新启动,或者它不能在关闭时终止,则使用 EnocNRoll 推荐的XYNTService 。 这是一个可怕的黑客,但它会为你想要的东西工作。
但到目前为止,最好的解决方案是将程序的功能与用户界面分开并编写适当的服务。 对于生产服务器,我不允许其他任何事情。 如果不容易分离,那么您无论如何都应该考虑一些设计问题。
您可能还需要考虑AlwaysUp ,这是一种商业应用程序,可以将任何应用程序作为 Windows 服务运行。 它类似于 XYNTService(由 EnocNRoll 提及),但具有更多功能并得到全面支持。
祝你好运!
您可以将 winforms 应用程序作为服务运行,但您将无法看到它——它将显示在所谓的虚拟桌面上,而无法在您的监视器上查看。
甚至考虑这一点的唯一方法是确保应用程序没有 UI 元素,因为您必须在非 Vista 机器上跳过箍才能使其工作,而在 Vista 上,您无法与桌面。
相反,您最好将功能重构为一组共享库,然后创建使用这些库的服务,并将其安装在客户端。
如果您的表单应用程序中有一个很好的解耦功能,那么使用其安装程序创建一个服务类应该很简单,然后在服务的 OnStart 方法中启动您的处理器类:
protected override void OnStart(string[] args)
{
Processor processor = new Processor();
Thread workerThread = new Thread(processor.OnStart);
workerThread.IsBackground = true;
try
{
workerThread.Start();
}
catch
{
//...
}
}
您可以使用InstallUtil将您的应用程序安装为服务,但您需要确保它不依赖于 GUI,我建议您更改应用程序的启动,以便它不会尝试创建任何表单。
找到了这篇名为How To Create a User-Defined Service 的文章。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.