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>
我不确定此后Web应用程序本身能否正确运行,但您可以正确访问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设计师的意图。但是,这似乎适用于我。
请访问http:// stackoverflow.com/questions/3912727/openmappedexeconfiguration-vs-openexeconfiguration/6599688#6599688 – 2011-07-06 16:19:15