在修改配置文件后,我需要重新加载它。如何使用应用程序域完成这个操作?提供一个代码示例会很有帮助。
在修改配置文件后,我需要重新加载它。如何使用应用程序域完成这个操作?提供一个代码示例会很有帮助。
假设您有以下配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="test" value="1" />
</appSettings>
</configuration>
我们先尝试一种朴素的方法。 下面的应用程序将每秒尝试一次获取名为test
的appSetting
的值,并打印其值:
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);
}
}
ConfigurationManager.RefreshSection("configuration");
Properties.Settings.Default.Reload();
是的,这是可能的……取决于您如何访问配置文件。
如果您依赖默认行为,则答案是“否”。
但是,如果通过项目常用的static
属性或方法访问配置,则可以重新加载它。
我现在没有代码片段,但即使使用FileSystemWatcher
来检测config
文件中的更改,我也做了类似的事情。
有一个警告,只有通过代码直接访问的属性才能重新加载,当您执行此操作时,自动配置将不会重新加载。
我已经找到了解决给定问题的方法。以下是几行代码,说明如何完成:
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");