我有一个 Windows 服务,该服务将每两周更新一次
我已经在 DLL 中获得了所有有用的代码,该服务只是几个简单的 Start
和 Stop
方法,它们映射到 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/