繁体   English   中英

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

[英]Running Windows Service Application without installing it

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

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

那非常不方便。 有没有更好的方法来做到这一点?

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

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

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

您不能像其他控制台或 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变量。 实现细节在这里

您可以在 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);
}


这是我用来调试 Windows 服务应用程序而不安装它们的一种简单方法,通过 Windows 服务控制管理器启动,附加到调试器等。以下是在 VB 中,但希望你能理解。

在这个例子中,TestService 的主类被命名为svcTest.vb

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

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

注释掉 Main() 中的所有内容并添加以下 2 行代码。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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