.net 是否将Windows窗体应用程序作为服务运行?

.net 是否将Windows窗体应用程序作为服务运行?,.net,winforms,windows-services,.net,Winforms,Windows Services,我有一个我编写的Windows窗体应用程序,它对收件箱和数据库进行一些监视。客户告知我,每次服务器重新启动时,它都需要运行。让客户改变要求真让我感到羞耻 我在想。。。有没有办法让Windows窗体应用程序作为服务运行,以便自动启动 澄清 我想尽量不必写更多的代码。。。如果可能的话 > P>唯一考虑的方法是确保应用程序没有UI元素,因为你必须跳过非Vista机器上的箍来完成这项工作,而在Vista上,你根本无法与桌面交互。 相反,您最好将功能重构为一组共享库,然后创建一个使用这些库的服务,并将其安

我有一个我编写的Windows窗体应用程序,它对收件箱和数据库进行一些监视。客户告知我,每次服务器重新启动时,它都需要运行。让客户改变要求真让我感到羞耻

我在想。。。有没有办法让Windows窗体应用程序作为服务运行,以便自动启动

澄清


我想尽量不必写更多的代码。。。如果可能的话

> P>唯一考虑的方法是确保应用程序没有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
        {
                      //...
        }
    }
找到了一个名为“如何创建用户定义的服务”

的方法,您可以使用它将应用程序作为服务安装,但您需要确保它不依赖于GUI,我建议您更改应用程序的启动,以便它不会尝试创建任何表单。

(此答案已过时,因为链接文章在2012年被删除。但是,StackOverflow不允许删除已接受的答案。因此,请不要否决此答案,因为我已通知您此答案已过时。)

Alt链接:

C++源代码(或使用文章上的“浏览代码”选项卡):

不幸的是,Zip文件源代码下载在备选链接中不起作用

从NT服务启动Windows程序 请查看这篇文章:

这是一篇非常古老的文章,但它已经工作了8年,作者继续更新它


它将执行您想要执行的操作。

您可以将winforms应用程序作为服务运行,但您将无法看到它——它将显示在所谓的虚拟桌面上,无法在监视器上查看。

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

如果它可以在无人值守的情况下运行,但可能需要手动关机并重新启动,或者不能在关机时终止,那么请按照的建议使用XYNTService。这是一个可怕的黑客攻击,但它可以满足您的需要


<>但是最好的解决方案是将程序的功能从用户界面中分离出来,并编写一个适当的服务。对于一个生产服务器,我不允许任何其他的东西。如果不容易分离,那么你就有一些设计问题需要考虑。

你也可以考虑,一个商业应用程序。at将以Windows服务的形式运行任何应用程序。它类似于XYNTService(EnocNRoll提到),但具有更多功能,并且完全受支持


祝你好运!

Hmmm…所以没有办法进入Windows服务,让它像服务一样运行我的应用程序?不,服务需要从ServiceBase类派生的类和ServiceInstaller类安装在Windows服务中。要使用InstallUtil,你需要从Installer派生的类,你还需要ServiceProcessInstaller()和安装程序类中定义的ServiceInstaller()对象。InstallUtil在exe项目中查找这些对象。也许我当时想的不是InstallUtil。我确实安装了一个“普通”使用命令行util.SC多次将应用程序作为服务。我发现Windows资源工具包中也有类似的东西…我认为测试这一点仍然很重要,因为如果用户未登录到服务器,应用程序的GUI方面在启动时可能会出现问题。在以前的任何场景中,我如果是这样,管理员会设置自动登录脚本并简单地启动exe。注意:我承认这是一个黑客行为,但这正是MattRuma在本例中所寻找的。链接的文章不再可用。您仍然可以在WayBack machine上找到文章:这应该可以工作,但它似乎不是一个非常有用的解决方案我发布的链接应该提供一个不那么混乱的方法。EnocNRoll是对的!不要使用那篇文章中的内容。它早已过时,没有什么真正的价值。这就是我想要做的。好吧,酷,那么就不用担心在没有登录上下文的情况下启动UI线程了?太好了!那么这两篇文章中的任何一篇都发布了理论上说,这是可行的。我认为马特鲁玛只是在寻找一种快速的方法来实现这一点。否则,我完全同意。然而,在某些东西投入生产后,以正确的方式做事的斗争几乎是永远不会赢的。是的……我在寻找快速而肮脏的……我没有时间或奢侈来做正确的事情。。.至少现在不行。是的,我知道那种感觉。只需使用XYNTService或任务调度程序,但要非常仔细地检查你的应用程序是否存在任何可能的无人参与的UI问题。