我需要在修改后重新加载配置文件。如何使用appdomains完成此操作?代码示例很有用。
答案 0 :(得分:10)
假设您有以下配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="test" value="1" />
</appSettings>
</configuration>
让我们先尝试一下天真的方法。以下应用程序将尝试每秒抓取一次appSetting
test
的值,并打印其值:
static void Main(string[] args)
{
while(true)
{
Console.WriteLine(ConfigurationManager.AppSettings["test"]);
Thread.Sleep(1000);
}
}
但是唉!在此过程中,您会发现它会一直打印1
,并且不会进行任何更改。
如果您将代码更新为以下内容,它将解决此问题,并且只要您更改它就会收到更改:
static void Main(string[] args)
{
while(true)
{
ConfigurationManager.RefreshSection("appSettings");
Console.WriteLine(ConfigurationManager.AppSettings["test"]);
Thread.Sleep(1000);
}
}
答案 1 :(得分:9)
答案 2 :(得分:2)
ConfigurationManager.RefreshSection("configuration");
Properties.Settings.Default.Reload();
答案 3 :(得分:1)
是的,有可能......取决于 HOW 您访问配置文件。
如果您依赖默认行为,则答案为否。
但是,如果您通过项目常用方法的static
属性访问配置,则可以重新加载它。
我现在没有代码片段,但即使使用FileSystemWatcher
来检测config
文件中的更改,我也做了类似的事情。
有一点需要注意,它仅适用于您通过代码直接访问的属性,当您执行此类操作时,不会重新加载自动配置。
答案 4 :(得分:0)
我实际上找到了给定问题的解决方案。下面是关于如何做到这一点的代码行:
AppDomainSetup domaininfo = new AppDomainSetup();
domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
domaininfo.ConfigurationFile = "Target_Config.exe.config";
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
AppDomain dom = AppDomain.CreateDomain("test", adevidence, domaininfo);
var someType =(SomeType)dom.CreateInstanceAndUnwrap("Target_Assembly",
"Target_Assembly.SomeType");
这里的关键点是AppDomainSetup类,它允许在要创建的程序集上设置configurationfile属性。现在,我们可以监视配置文件“Target_Config.exe.config”以进行更改。更改后,应卸载上面创建的appdomain,然后重新创建。