运行Windows服务应用程序而不安装它

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运行Windows服务应用程序而不安装它相关的知识,希望对你有一定的参考价值。

当我正在编写Windows服务并点击F5时,我收到错误消息,我必须使用installutil.exe安装它,然后运行它。在实践中,这意味着每次我更改一行代码:

  1. 切换到开发人员命令提示符
  2. 删除旧版本
  3. 安装新版本
  4. 开始服务

这非常不方便。有没有更好的方法呢?

答案

我通常将大部分服务实现放入类库中,然后创建两个“前端”来运行它 - 一个是服务项目,另一个是控制台或Windows窗体应用程序。我使用控制台/表单应用程序进行调试。

但是,您应该了解调试体验与作为真正服务运行时的环境差异 - 例如您可能会意外地最终依赖于与交互式用户的会话中运行,或者(对于winforms)正在运行消息泵。

另一答案

我认为最好的方法是使用Debug指令。以下是相同的示例。

#if(!DEBUG)
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
    { 
         // Calling MyService Constructor 
            new MyService() 
    };
     ServiceBase.Run(ServicesToRun);
#else
  MyService serviceCall = new MyService();
  serviceCall.YourMethodContainingLogic();
#endif

点击F5并在你的Breakpoint方法上设置一个YourMethodContainingLogic来调试它。

另一答案

您无法像另一个控制台或WinForms应用程序那样运行Windows服务。它需要由Windows本身启动。

如果您没有准备好使用的基础架构,如@Damien_The_Unbeliever建议的那样(我也建议这样做),您可以从调试位置安装该服务。因此,您使用installutil一次并将其指向位于/bin/debug的可执行文件。然后从services.msc启动服务并使用Visual Studio > Debug > Attach to Process菜单并附加到Windows服务。

你也可以考虑使用Thread.Sleep(10000)作为OnStart调用中的第一行,或者Debugger.Break()来帮助你在服务执行任何工作之前能够附加。不要忘记在发布之前删除它们。

另一答案

你可以使用Environment.UserInteractive变量。实施细节here

以上是关于运行Windows服务应用程序而不安装它的主要内容,如果未能解决你的问题,请参考以下文章

如何运行Windows窗体应用程序而不安装SQL Server Studio但从其数据库访问实时数据(服务器)

播放随机声音而不重复

创建片段而不从 java 代码实例化它

在片段中在运行时更改方向时更改布局而不重新创建视图

如何在类方法中触发hangfire而不向触发它发送请求

在wix中进行重大升级时如何只停止而不卸载Windows服务?