13

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

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

这是非常不方便的。有更好的方法吗?

4

6 回答 6

17

我认为最好的方法是使用Debug指令。下面是一个相同的例子。

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

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

于 2014-02-12T08:51:08.080 回答
11

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

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

于 2013-05-17T08:50:23.390 回答
2

您不能像其他控制台或 WinForms 应用程序那样运行 Windows 服务。它需要由 Windows 自己启动。

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

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

于 2013-05-17T09:34:30.273 回答
1

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


于 2020-01-14T08:14:36.570 回答
0

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

于 2013-05-17T11:42:01.480 回答
0

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

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

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

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 完成的。

于 2020-07-16T20:04:02.033 回答