繁体   English   中英

将 Windows 窗体应用程序作为服务运行?

[英]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 文件源代码下载在替代链接中不起作用。

从 NT 服务启动 Windows 程序

看看这篇文章: http : //www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=719&av=49654

这是一篇非常古老的文章,但它已经工作了 8 年,并且作者仍在不断更新。

它会做你想做的事。

如果您确定应用程序可以在无人看管的情况下安全地运行(我的意思是它永远不会抛出像消息框这样的模式 UI 元素)并且它在关闭之前不需要任何交互,在关闭时它会简单地终止,然后运行它作为触发器设置为系统启动的计划任务。

如果它可以无人值守运行,但可能需要手动关闭并重新启动,或者它不能在关闭时终止,则使用 E​​nocNRoll 推荐的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM