[英]Running Windows Service Application without installing it
我正在编写 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
并在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.