替换WCF服务库而不重新启动服务

NDe*_*per 6 .net c# iis wcf windows-services

我有一个托管在Windows服务中的WCF服务,我有两个程序集主机(.exe)和服务库(.dll).更新服务库后,我们必须停止服务才能更换库.我想有IIS类似的功能,比如更换库而不重新启动服务.有可能吗?怎么样?

Pet*_*man 4

IIS 使用卷影副本来实现此目的。您可以为您的服务主机实现类似的东西。基本上,其想法是在启动服务之前,将 .DLL 复制到其他位置,并让主机从该副本加载您的服务类。然后,主机设置文件系统监视器来侦听对原始文件的更改。如果检测到,它会停止服务,复制新文件,然后重新启动。

编辑

(1) 要使用特定类型库中的类启动 ServiceHost,您必须使用反射。像下面这样:

Assembly myAssembly = Assembly.LoadFile(path);

Type serviceType = myAssembly.GetType(className);

ServiceHost serviceHost = new ServiceHost(serviceType);
Run Code Online (Sandbox Code Playgroud)

从文档中并不清楚 LoadFile 如何解决依赖关系。您可能必须挂钩 Assembly.ModuleResolve 事件才能完成此操作。

(2) 文件系统监视器肯定会产生一些开销,但根据我的经验,这是最小的。无论如何,这确实是您唯一的选择,除非您想使用更新的 DLL 的安装程序。

(3) 我不知道为什么你的文件被锁定。您必须自己解决这个问题。