2

让我先解释一下场景。

我已经从一个安装库安装了多个服务副本(比如 10 个)。现在我想更新其中一个 dll。我需要停止所有服务,更新 dll 并再次重新启动服务。

为了避免这种情况,我在代码中使用了 ShadowCopying。这样可以在不停止所有服务的情况下更新 dll。如下。

static void Main(string[] args)
{
    AppDomain.CurrentDomain.SetCachePath(@"C:\Cache");
    AppDomain.CurrentDomain.SetShadowCopyPath(AppDomain.CurrentDomain.BaseDirectory);
    AppDomain.CurrentDomain.SetShadowCopyFiles();

    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
        { 
            new SampleService(serviceName) 
        };
    ServiceBase.Run(ServicesToRun);
}

现在我试图通过 app.config 文件来实现相同的功能,如下所示,来自 Asp.Net

<hostingEnvironment 
    idleTimeout="Infinite" 
    shutdownTimeout="30" 
    shadowCopyBinAssemblies="true" />

有什么建议么?

4

1 回答 1

2

ASP.Net 宿主环境具有用于管理应用程序回收的内置支持。

Windows .Net 服务使用不支持此功能的标准 CLR 主机。你必须实现你自己的例如

  1. 创建一个子节点AppDomain来托管您的服务代码,并配置卷影复制。
  2. 使用类似 a 的东西FileSystemWatcher来监视原始 bin 目录。
  3. 当文件发生变化时,拆除你的AppDomain并创建一个新的并重新加载。

ASP.Net 主机在这些方面做了一些事情(但也有能力管理现有请求,在此过程中排队新请求等)。

于 2011-09-30T10:33:21.133 回答