129

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

我想使用一个自定义ConfigurationSection的,对于 ASP.NET 页面,这很好用。但是,当组件通过 COM 互操作从经典 ASP 页面调用时,组件不在 ASP.NET 请求的上下文中运行,因此不知道 web.config。

有没有办法告诉ConfigurationManager只从任意路径加载配置(例如..\web.config,如果我的程序集在/bin文件夹中)?如果有,那么我认为如果我的自定义部分默认ConfigurationManager.GetSection返回,我的组件可以回退到那个状态。null

任何其他方法都将受到欢迎!

4

9 回答 9

129

试试这个:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
于 2008-08-07T14:14:44.187 回答
72

另一种解决方案是覆盖默认的环境配置文件路径。

我发现它是非平凡路径配置文件加载的最佳解决方案,特别是将配置文件附加到 dll 的最佳方法。

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

例子:

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

更多细节可以在这个博客中找到。

此外,这个另一个答案有一个很好的解决方案,包括刷新应用程序配置的代码和一个IDisposable将其重置回原始状态的对象。使用此解决方案,您可以将临时应用配置保持在范围内:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}
于 2013-01-09T20:52:41.130 回答
42

Ishmaeel 的答案通常确实有效,但是我发现了一个问题,那就是 usingOpenMappedMachineConfiguration似乎会丢失您从 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 设计者的意图使用这些功能。但是,这似乎对我有用。

于 2010-09-29T02:52:01.277 回答
12

接受的答案是错误的!

它在访问 AppSettings 属性时引发以下异常:

无法将“System.Configuration.DefaultSection”类型的对象转换为“System.Configuration.AppSettingsSection”类型。

这是正确的解决方案:

System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
于 2019-03-19T13:12:05.547 回答
10

除了 Ishmaeel 的回答之外,该方法OpenMappedMachineConfiguration()将始终返回一个Configuration对象。因此,要检查它是否已加载,您应该检查HasFiletrue 表示它来自文件的属性。

于 2008-08-08T14:04:32.857 回答
4

我向 word 托管的 .nET Compoent 提供了配置值,如下所示。

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

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
于 2010-11-11T18:38:54.967 回答
1

对于 ASP.NET,使用 WebConfigurationManager:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;
于 2014-07-14T20:43:22.873 回答
1

这应该可以解决问题:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "newAppConfig.config);

来源:https ://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files

于 2018-08-09T10:53:32.317 回答
0

使用 XML 处理:

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

// can call root.Elements(...)
于 2016-02-08T22:18:57.280 回答