当配置的任何部分发生变化时,我必须完全重启应用程序。 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;
答案 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() 。错误检查是让这很难的原因......