2

我有一个 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)(阻塞调用)。我应该尝试从服务中模拟相同的内容还是有更好的方法?

4

2 回答 2

3

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

加载 dll 插件样式使您不必持有程序集引用。并且额外的 AppDomain 允许您卸载 dll 程序集而无需拆除服务 AppDomain(通常是一种不愉快的使用体验)。

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

于 2012-07-07T00:41:23.903 回答
2

为此,您不需要可执行文件。您可以在启动服务时动态加载 DLL。要么手动执行(请参阅此链接),要么使用MEF之类的东西为您加载它。

另一种简单的方法是使用TopShelf来托管您的服务。使用 TopShelf,您可以将服务作为控制台应用程序开发和运行。当您将参数 install 传递给控制台应用程序时,它将作为服务安装。由于您不需要安装程序,因此易于更换。

于 2012-07-07T00:42:35.077 回答