Ishmaeelの答えは一般的には機能しOpenMappedMachineConfiguration
ますが、使用するとmachine.configから継承したセクショングループが失われるように見えるという問題が1つ見つかりました。これは、独自のカスタムセクション(必要なすべての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として登録されていないため、通常のチャネルからはほとんどアクセスできません。
これを回避するには2つの方法があります。最初は、私が好きではありませんが、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>
その後、Webアプリケーション自体が正しく実行されるかどうかはわかりませんが、sectionGroupsに正しくアクセスできます。
2つ目の解決策は、代わりに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デザイナーが意図した方法でこれらの関数をまったく使用していません。しかし、これは私にはうまくいくようです。