我在Windows服务中托管了一个WCF服务,我有2个程序集,主机(.exe)和服务库(.dll)。更新服务库后,我们必须停止服务才能更换库。我想有IIS类似的功能,比如更换库而不重新启动服务。 它有可能吗?如何?
答案 0 :(得分:4)
IIS使用称为卷影副本的东西来实现此目的。您可以为服务主机实现类似的功能。基本上,我们的想法是在启动服务之前,将.DLL复制到其他位置,让主机从该副本加载服务类。然后,主机设置文件系统监视器以侦听对原始文件的更改。如果检测到一个,它将停止服务,复制新文件,然后重新启动。
修改强>
(1)要使用特定类型库中的类启动ServiceHost,您必须使用反射。如下所示:
Assembly myAssembly = Assembly.LoadFile(path);
Type serviceType = myAssembly.GetType(className);
ServiceHost serviceHost = new ServiceHost(serviceType);
从文档中不清楚LoadFile如何解析依赖关系。您可能必须挂钩Assembly.ModuleResolve事件才能使其正常工作。
(2)文件系统监视器肯定会产生一些开销,但根据我的经验,它是最小的。在任何情况下,这都是您唯一的选择,除非您想使用安装程序获取更新的DLL。
(3)我不知道为什么你的文件被锁定了。你必须自己排除故障。
答案 1 :(得分:2)