Я не уверен, что вы можете сделать это программно. Вы должны сопоставить данные конфигурации с фактическими классами реализации (и свойствами). Кроме того, если в настоящее время используется конфигурация, вы должны убедиться, что программные изменения переопределят конфигурацию.
В этом примере я читаю конфигурацию, изменяю некоторые настройки, копирую конфигурацию и записываю ее обратно в файл конфигурации. Это становится трудоемким, потому что многие свойства доступны только для чтения, поэтому необходимо создавать новые объекты. Написание конфигурации должно работать, но я не проверял фактического вызова Enterprise Library после этого (и я действительно не рекомендовал бы делать это для производственного приложения).
// Open config file
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"MyApp.exe.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
// Get EL log settings
LoggingSettings log = config.GetSection("loggingConfiguration") as LoggingSettings;
List<TraceListenerData> newListeners = new List<TraceListenerData>();
foreach(TraceListenerData listener in log.TraceListeners)
{
// set new values for TraceListeners
if (listener is FormattedEventLogTraceListenerData)
{
FormattedEventLogTraceListenerData oldData = listener as FormattedEventLogTraceListenerData;
FormattedEventLogTraceListenerData data =
new FormattedEventLogTraceListenerData(oldData.Name, oldData.Source + "new", oldData.Log, oldData.MachineName, oldData.Formatter, oldData.TraceOutputOptions);
newListeners.Add(data);
}
else if (listener is RollingFlatFileTraceListenerData)
{
RollingFlatFileTraceListenerData oldData = listener as RollingFlatFileTraceListenerData;
RollingFlatFileTraceListenerData data =
new RollingFlatFileTraceListenerData(oldData.Name, oldData.FileName + ".new", oldData.Header, oldData.Footer, oldData.RollSizeKB, oldData.TimeStampPattern, oldData.RollFileExistsBehavior, oldData.RollInterval, oldData.TraceOutputOptions, oldData.Formatter, oldData.Filter);
newListeners.Add(data);
}
}
// Replace the listeners
foreach (TraceListenerData traceListener in newListeners)
{
log.TraceListeners.Remove(traceListener.Name);
log.TraceListeners.Add(traceListener);
}
// Copy the LogSettings since when config.Sections.Remove() is called the original log object becomes "empty".
LoggingSettings newLog = new LoggingSettings();
newLog.DefaultCategory = log.DefaultCategory;
foreach (var formatter in log.Formatters)
{
newLog.Formatters.Add(formatter);
}
foreach (var filter in log.LogFilters)
{
newLog.LogFilters.Add(filter);
}
foreach (var listener in log.TraceListeners)
{
newLog.TraceListeners.Add(listener);
}
foreach (var source in log.TraceSources)
{
newLog.TraceSources.Add(source);
}
newLog.LogWarningWhenNoCategoriesMatch = log.LogWarningWhenNoCategoriesMatch;
newLog.RevertImpersonation = log.RevertImpersonation;
newLog.SpecialTraceSources = log.SpecialTraceSources;
newLog.TracingEnabled = log.TracingEnabled;
// replace section
config.Sections.Remove("loggingConfiguration");
config.Sections.Add("loggingConfiguration", newLog);
// save and reload config
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("loggingConfiguration");
Если это не 100%, что вы хотели, надеюсь, это даст вам некоторые идеи.