使用 app.config 配置卷影复制

Posted

技术标签:

【中文标题】使用 app.config 配置卷影复制【英文标题】:Configure Shadow Copy using app.config 【发布时间】:2011-09-30 10:23:26 【问题描述】:

让我先解释一下场景。

我已经从一个安装库安装了多个服务副本(比如 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" />

有什么建议吗?

【问题讨论】:

你根本没有说这个问题。你有什么问题吗?请不要让我们尝试您的代码并让我们谈论问题。 我正在尝试单独使用配置文件实现影子复制,就像 ASP.net 所做的那样。没有在代码中创建应用程序域...我被卡住了... 【参考方案1】:

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

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

    创建一个子 AppDomain 来托管您的服务代码,并配置卷影复制。 使用 FileSystemWatcher 之类的东西来监控原始 bin 目录。 当文件更改时,请拆除您的 AppDomain 并创建一个新的并重新加载。

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

【讨论】:

以上是关于使用 app.config 配置卷影复制的主要内容,如果未能解决你的问题,请参考以下文章

需要在 32/64 位 QT C++ 程序中使用卷影复制服务

Windows 卷影复制错误:2155348129

如何在 app.config 中创建自定义配置部分? [复制]

如何在 C# 中配置 app.config 文件? [复制]

AppDomain 卷影复制不起作用(原始程序集被锁定)

将 app.config 设置复制到 web.config 的替代方法?