使用ConfigurationManager从任意位置加载configuration

我正在开发一个数据访问组件,将在一个包含经典ASP和ASP.NET页面的网站中使用,并且需要一个pipe理其configuration设置的好方法。

我想使用一个自定义的ConfigurationSection ,并为ASP.NET页面这很好。 但是,当通过COM interop从传统的ASP页面调用组件时,该组件不在ASP.NET请求的上下文中运行,因此不了解web.config。

有没有办法告诉ConfigurationManager从任意path加载configuration(例如..\web.config如果我的程序集位于/bin文件夹中, ..\web.config )? 如果有的话,我想我的组件可以回落到,如果默认ConfigurationManager.GetSection为我的自定义部分返回null

任何其他方法,这将是受欢迎的!

尝试这个:

 System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap); 

另一个解决scheme是覆盖默认的环境configuration文件path。

我发现它是非平凡pathconfiguration文件加载的最佳解决scheme,特别是将configuration文件附加到dll的最佳方法。

 AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>); 

例:

 AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config"); 

更多细节可以在这个博客上find。

此外, 这个其他的答案有一个很好的解决scheme,完整的代码来刷新应用程序configuration和一个IDisposable对象重置它回到原来的状态。 有了这个解决scheme,你可以保持临时应用程序的configuration范围:

 using(AppConfig.Change(tempFileName)) { // tempFileName is used for the app config during this context } 

Ishmaeel的答案一般工作,但是我发现一个问题,那就是使用OpenMappedMachineConfiguration似乎失去了从machine.configinheritance的部分组。 这意味着您可以访问您自己的自定义部分(这是所有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作为EXEconfiguration打开,这可能更接近其预期的function:

 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的,都没有使用.NETdevise者所期望的这些function。 但是,这似乎为我工作。

除了Ishmaeel的回答之外,方法OpenMappedMachineConfiguration()将始终返回一个Configuration对象。 所以要检查它是否加载,你应该检查HasFile属性,其中true表示它来自一个文件。

我按如下方式向word托pipe的.nET Compoent提供了configuration值。

在MS Word中调用/托pipe的.NET类库组件。 为了向我的组件提供configuration值,我在C:\ Program Files \ Microsoft Office \ OFFICE11文件夹中创build了winword.exe.config。 您应该能够像在传统.NET中那样读取configuration值。

 string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"]; 

对于ASP.NET使用WebConfigurationManager:

 var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/"); (..) config.AppSettings.Settings["xxxx"].Value; 

使用XML处理:

 var appPath = AppDomain.CurrentDomain.BaseDirectory; var configPath = Path.Combine(appPath, baseFileName);; var root = XElement.Load(configPath); // can call root.Elements(...)