A resposta de Ishmaeel geralmente funciona, no entanto, encontrei um problema, que é o de que o uso OpenMappedMachineConfiguration
parece perder seus grupos de seções herdados do machine.config. Isso significa que você pode acessar suas próprias seções personalizadas (que é todo o OP desejado), mas não as seções normais do sistema. Por exemplo, este código não funcionará:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
Basicamente, se você observar configuration.SectionGroups
, verá que o system.net não está registrado como um SectionGroup, por isso é praticamente inacessível pelos canais normais.
Encontrei duas maneiras de contornar isso. A primeira, da qual não gosto, é reimplementar os grupos de seções do sistema, copiando-os do machine.config para o seu próprio web.config, por exemplo
<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>
Não sei se o aplicativo da Web será executado corretamente depois disso, mas você pode acessar os sectionGroups corretamente.
A segunda solução é abrir o seu web.config como uma configuração EXE, que provavelmente está mais próxima da função pretendida:
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!
Ouso dizer que nenhuma das respostas fornecidas aqui, nem a minha nem a de Ishmaeel, estão usando essas funções como os projetistas do .NET pretendiam. Mas, isso parece funcionar para mim.