配置更改时.Net应用程序自动重启

时间:2011-01-17 07:30:42

标签: .net configuration

当配置的任何部分发生变化时,我必须完全重启应用程序。 IIS最好在asp.net应用程序中查看配置,但如何重新启动控制台或服务等应用程序?

使用FileSystemWatcher监控配置文件更改是否可以启动应用程序的新实例,关闭当前应用程序?

类似的东西:

    var file = new FileInfo(AppDomain.CurrentDomain.
SetupInformation.ConfigurationFile);

    var watcher = new FileSystemWatch(file.Directory.FullName)
                      { 
                          Filter = "...", 
                          NotifyFilter = NotifyFilter.LastWrite }
                      );

    watcher.Changed += .. // Process.Start(..), current process shutdown 
    watcher.EnableRaisingEvents = true;

4 个答案:

答案 0 :(得分:2)

您可以在单独的AppDomain中运行实际的应用程序逻辑。初始(或默认)AppDomain仅用于(a)使用文件系统观察程序启动线程,以及(b)在单独的AppDomain中启动应用程序逻辑。关键是,您可以在创建AppDomain时将路径传递给配置文件。

当您确定配置文件中的更改时,您将停止应用程序逻辑(在您的情况下意味着什么 - 这是非常棘手的部分!)并卸载AppDomain,然后重新启动它,这将使用更新的配置文件。

答案 1 :(得分:1)

据我所知,.NET的标准应用程序配置不允许动态更新。但是,如果我是你,我宁愿编写我自己的应用程序配置类,它读取xml或任何配置,监视此配置文件的更改,如果更改了某些内容,我自己的类将动态重新加载配置文件。如果这是可能的,它应该比杀死和启动新进程更优雅。

如果您的应用程序在多次调用时没有问题(启动新进程时有两个实例)并且被停止,并且配置更改很少发生,那么您的方法应该没有任何缺陷。我不知道你是否可以善意启动Windows服务。

答案 2 :(得分:1)

我不确定Asp.net,但也许您可以在不同的AppDomain中加载您的应用程序,并在配置更改时重新加载域。这将基本上使用新设置重新初始化您的应用程序。

以下是你可以采取的措施:

            AppDomainSetup setup = new AppDomainSetup()
            {
                ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
                // ... maybe more options can go here, inspect the class and see your options
            };

            domain = AppDomain.CreateDomain("MyDomainName", null, setup);
            domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
            MyApplication app = (MyApplication)domain.CreateInstanceFromAndUnwrap("assemblyfilename.dll", "The_Type_Name.MyApplication" );
            app.Launch();

答案 3 :(得分:1)

当调试器记住Visual Studio启动XXX.vshost.exe而不是XXX.exe时,所以你需要在调试时看一个不同的文件。

FileSystemWatch很容易,您需要使用第二个应用程序域来运行您的主应用程序或拥有一个“启动器”应用程序,或让您的应用程序在需要重新启动时自行调用Process.Start() 。错误检查是让这很难的原因......