运行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并在YourMethodContainingLogic方法上设置一个Breakpoint来调试它。

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

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

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

您可以使用Environment.UserInteractive变量。 这里的实施细节