.net - 如何正确处理频繁变化的.Net windows服务

标签 .net windows-services

我有一个 Windows 服务,该服务将每两周更新一次

我已经在 DLL 中获得了所有有用的代码,该服务只是几个简单的 StartStop 方法,它们映射到 DLL 中的相同方法.

我使用控制台应用程序来开发/调试 DLL,所以我想知道;使用该服务包装控制台应用程序是否有任何缺点,而不是直接引用 DLL 并在每次更新时都需要卸载/重新安装的服务?

也就是说,而不是...

Private MyService as IMyService
Sub Start()
    MyService = New MyService()
    MyService.StartAsync()
End Start

做类似的事情

Const ServiceExecutablePath As String = "C:\Blah\MyService.exe"
Private MyService as Process
Sub Start()
    MyService = Process.Start(ServiceExecutablePath)
End Start

这样,如果我想发布,我所需要做的就是停止服务,替换可执行文件(和相关的 DLL),然后再次启动它。

我还没有完全弄清楚如何正常关闭。控制台应用监听 CTRL C 中断并调用 MyService.Shutdown(Graceful:=True) (阻塞调用)。我应该尝试在服务中模拟相同的内容还是有更好的方法?

最佳答案

我不会包装控制台应用程序,而是在服务中启动一个新的 AppDomain,并将 dll(插件样式)加载到新的 AppDomain 中并在那里调用您的方法。这样,在停止时您可以拆除 AppDomain,它会释放 dll 以供您重新使用。

加载 dll 插件样式使您无需保存程序集引用。额外的 AppDomain 允许您卸载 dll 程序集,而无需拆除服务 AppDomain(通常使用起来会带来不愉快的体验)。

我会避免包装控制台应用程序,因为服务通常不能与 UI 应用程序很好地配合。您的控制台窗口仍会生成 UI(控制台窗口)。

关于.net - 如何正确处理频繁变化的.Net windows服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11371336/

相关文章:

.net - 我可以使用 VS2010 的 Intellitrace 收集 Windows 服务的数据吗?

c# - 如何在 Silverlight 中创建客户端帮助程序类?

c# - 在指定位置打开一个 "ColorDialog"对话框

c# - IL 的 'short' 符号的目的是什么?

c# - 音标转语音

asp.net-mvc-3 - 我可以从 Windows 服务调用 MVC 操作吗?

vb6 - 在vb6中创建一个windows服务

Python 日志记录模块在已安装的 Windows 服务中不起作用

c++ - 如何使用 WinAPI 函数检查当前进程是否作为 Windows 服务运行?

c# - ClosedXML 返回文件