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
기본적으로에 watch를 넣으면 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이 .NET 디자이너가 의도 한 방식으로 이러한 기능을 사용하고 있다고 감히 생각하지 않습니다. 그러나 이것은 나를 위해 일하는 것 같습니다.