当我正在编写 Windows 服务并按 F5 时,我收到错误消息,我必须使用它来安装它installutil.exe
然后运行它。实际上,这意味着每次我更改一行代码时:
- 编译
- 切换到开发人员命令提示符
- 删除旧版本
- 安装新版本
- 启动服务
这是非常不方便的。有更好的方法吗?
当我正在编写 Windows 服务并按 F5 时,我收到错误消息,我必须使用它来安装它installutil.exe
然后运行它。实际上,这意味着每次我更改一行代码时:
这是非常不方便的。有更好的方法吗?
我认为最好的方法是使用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
方法上设置一个来调试它。
我通常将大部分服务实现放入一个类库中,然后创建两个“前端”来运行它——一个是服务项目,另一个是控制台或 Windows 窗体应用程序。我使用控制台/表单应用程序进行调试。
但是,您应该注意调试体验和作为真正服务运行时的环境差异 - 例如,您可能会意外地依赖于在与交互式用户的会话中运行,或者(对于 winforms)在消息泵的情况下运行在跑。
您不能像其他控制台或 WinForms 应用程序那样运行 Windows 服务。它需要由 Windows 自己启动。
如果您没有准备好使用@Damien_The_Unbeliever 建议的基础设施(这也是我的建议),您可以从调试位置安装该服务。因此,您使用installutil
一次并将其指向位于/bin/debug
. 然后,您从services.msc
并使用Visual Studio > Debug > Attach to Process
菜单启动服务并附加到 Windows 服务。
您还可以考虑将Thread.Sleep(10000)
其用作调用中的第一行OnStart
,或者Debugger.Break()
帮助您在服务执行任何工作之前进行附加。不要忘记在发布之前删除它们。
您可以在 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);
}
您可以使用Environment.UserInteractive
变量。实现细节在这里
这是我用来调试 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 完成的。