Kob*_*ahy 37 c# configuration configuration-files
我正在使用Framework 4.0在C#中开发一个应用程序.
在我的应用程序中,我想创建一个不是app.config文件的单独配置文件.配置文件包含我们为产品开发的自定义配置部分.
我不想使用configSource从app.config引用此文件.
我想在运行时加载它并读取它的内容.
我的意思是log4net,它允许您在log4net.config文件中编写配置.
任何人都可以帮助如何做到这一点,而无需编写模仿框架中存在的代码的代码?
更新:
根据Kaido的回答,我写了一个实用程序类来读取自定义配置文件,并且能够在文件系统上的文件发生更改时刷新Config内容.
本课程的用法如下:
获取配置文件内容
// Create configuration reader that reads the files once
var configFileReader = new CustomConfigurationFileReader("c:\\myconfig.config");
var config = configFileReader.Config;
// Do any action you want with the config object like:
config.GetSection("my.custom.section");
// or,
var someVal = config.AppSettings.Settings["someKey"];
Run Code Online (Sandbox Code Playgroud)配置文件更改时获取通知
// Create configuration reader that notifies when the configuraiton file changes
var configFileReader = new CustomConfigurationFileReader("c:\\myconfig.config", true);
// Register to the FileChanged event
configFileReader.FileChanged += MyEventHandler;
...
private void MyEventHanler(object sender, EventArgs e)
{
// You can safely access the Config property here, it is already contains the new content
}
Run Code Online (Sandbox Code Playgroud)在代码中我使用PostSharp来验证构造函数输入参数,以验证日志文件不为null并且文件是否存在.您可以更改代码以在代码中内联进行这些验证(尽管我建议使用PostSharp将应用程序分隔到各个方面).
这是代码:
using System;
using System.Configuration;
using System.IO;
using CSG.Core.Validation;
namespace CSG.Core.Configuration
{
/// <summary>
/// Reads customer configuration file
/// </summary>
public class CustomConfigurationFileReader
{
// By default, don't notify on file change
private const bool DEFAULT_NOTIFY_BEHAVIOUR = false;
#region Fields
// The configuration file name
private readonly string _configFileName;
/// <summary>
/// Raises when the configuraiton file is modified
/// </summary>
public event System.EventHandler FileChanged;
#endregion Fields
#region Constructor
/// <summary>
/// Initialize a new instance of the CustomConfigurationFileReader class that notifies
/// when the configuration file changes.
/// </summary>
/// <param name="configFileName">The full path to the custom configuration file</param>
public CustomConfigurationFileReader(string configFileName)
: this(configFileName, DEFAULT_NOTIFY_BEHAVIOUR)
{
}
/// <summary>
/// Initialize a new instance of the CustomConfigurationFileReader class
/// </summary>
/// <param name="configFileName">The full path to the custom configuration file</param>
/// <param name="notifyOnFileChange">Indicate if to raise the FileChange event when the configuraiton file changes</param>
[ValidateParameters]
public CustomConfigurationFileReader([NotNull, FileExists]string configFileName, bool notifyOnFileChange)
{
// Set the configuration file name
_configFileName = configFileName;
// Read the configuration File
ReadConfiguration();
// Start watch the configuration file (if notifyOnFileChanged is true)
if(notifyOnFileChange)
WatchConfigFile();
}
#endregion Constructor
/// <summary>
/// Get the configuration that represents the content of the configuration file
/// </summary>
public System.Configuration.Configuration Config
{
get;
set;
}
#region Helper Methods
/// <summary>
/// Watch the configuraiton file for changes
/// </summary>
private void WatchConfigFile()
{
var watcher = new FileSystemWatcher(_configFileName);
watcher.Changed += ConfigFileChangedEvent;
}
/// <summary>
/// Read the configuration file
/// </summary>
public void ReadConfiguration()
{
// Create config file map to point to the configuration file
var configFileMap = new ExeConfigurationFileMap
{
ExeConfigFilename = _configFileName
};
// Create configuration object that contains the content of the custom configuration file
Config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
}
/// <summary>
/// Called when the configuration file changed.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ConfigFileChangedEvent(object sender, FileSystemEventArgs e)
{
// Check if the file changed event has listeners
if (FileChanged != null)
// Raise the event
FileChanged(this, new EventArgs());
}
#endregion Helper Methods
}
}
Run Code Online (Sandbox Code Playgroud)
Kai*_*ido 21
// Map the roaming configuration file. This
// enables the application to access
// the configuration file using the
// System.Configuration.Configuration class
ExeConfigurationFileMap configFileMap =
new ExeConfigurationFileMap();
configFileMap.ExeConfigFilename =
roamingConfig.FilePath;
// Get the mapped configuration file.
Configuration config =
ConfigurationManager.OpenMappedExeConfiguration(
configFileMap, ConfigurationUserLevel.None);
Run Code Online (Sandbox Code Playgroud)
来自http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx
在过去,我使用了Nini - http://nini.sourceforge.net/manual.php,它允许您在运行时读/写自定义配置文件(XML/Ini/Registry/.Config).
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
61865 次 |
| 最近记录: |