Ответы Ishmaeel обычно работают, однако я обнаружил одну проблему, которая заключается в том, что использование OpenMappedMachineConfiguration
, похоже, потеряет ваши наследованные группы разделов из machine.config. Это означает, что вы можете получить доступ к своим собственным разделам (которые все нужны OP), но не к нормальным разделам системы. Например, этот код не будет работать:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
В принципе, если вы положите часы на configuration.SectionGroups
, вы увидите, что system.net не зарегистрирован как SectionGroup, так что это в значительной степени недоступен через нормальный каналы.
Есть два пути, которые я нашел, чтобы обойти это. Первое, что мне не нравится, - это повторное внедрение групп секций системы, скопировав их из machine.config в ваш собственный web.config, например.
<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
</sectionGroup>
Я не уверен, что сам веб-приложение будет работать правильно после этого, но вы можете получить доступ к sectionGroups правильно.
Второе решение это вместо того, чтобы открыть web.config в качестве конфигурации EXE, которая, вероятно, ближе к его предполагаемой функции так или иначе:
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns valid object!
Осмелюсь ни один из ответов не предусмотрено здесь, ни мне, ни Ishmaeel's, вполне используют эти функции, как планировали разработчики .NET. Но, похоже, это работает для меня.
Смотреть Http: // stackoverflow.com/questions/3912727/openmappedexeconfiguration-vs-openexeconfiguration/6599688#6599688 – 2011-07-06 16:19:15