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

时间:2013-05-17 08:38:06

标签: c# .net visual-studio windows-services

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

  1. 编译
  2. 切换到开发人员命令提示符
  3. 删除旧版本
  4. 安装新版本
  5. 开始服务
  6. 这非常不方便。有没有更好的方法呢?

6 个答案:

答案 0 :(得分:12)

我认为最好的方法是使用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进行调试。

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

您可以使用Environment.UserInteractive变量。实施细则here

答案 4 :(得分:0)

您可以在program.cs中编写此代码

//if not in Debug
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] 
{ 
   new MyService() 
};
ServiceBase.Run(ServicesToRun);

//if debug mode
MyService service = new MyService();
service.OnDebug();
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);

在MyService类中

public void OnDebug()
{
   OnStart(null);
}


答案 5 :(得分:0)

这是一种简便的方法,用于调试Windows服务应用程序而无需安装它们,它是通过Windows服务控制管理器开始,附加到调试器等的。下面是VB,但希望您能理解。

在此示例中,TestService的主类名为svcTest.vb

Shared Sub Main()内的svcTest.Designer.vb中,默认代码如下所示:

Dim ServicesToRun() As System.ServiceProcess.ServiceBase
ServicesToRun = New System.ServiceProcess.ServiceBase() {New svcTest}
System.ServiceProcess.ServiceBase.Run(ServicesToRun)

在Main()中注释所有内容,并添加以下两行代码。

Dim objSvc As New svcTest()
objSvc.OnStart(Nothing)

现在只需在要开始调试的位置设置一个断点,按F11键进入代码,然后像处理标准桌面应用程序一样正常进行。完成调试后,只需撤消在Main()中所做的更改。

这是使用Windows Server 2012 R2上的Visual Studio Enterprise 2017完成的。