如何让.NET类库读取自己的配置文件?

时间:2011-03-18 17:42:07

标签: .net configuration configuration-files class-library

我有一个.NET类库,它提供了一组由多个Web服务使用的辅助函数。此类库必须存储单个设置,特别是连接字符串,Web服务本身无需查看,因为它们都必须查询相同的数据库。

不幸的是,.NET无法轻松读取DLL的app.config文件。唯一的“简单”解决方案是将连接字符串存储在每个 Web服务配置文件中,这完全是bollocks。

通常,我关心代码优雅,但这次我真的需要一个解决方案,即使它是一个黑客。有没有办法让.NET类库有自己的配置?


编辑:从技术上讲,我可以将所有这些Web服务合并到一个Web服务中。但是,出于商业原因(每个Web服务将单独出售),我不能这样做。

7 个答案:

答案 0 :(得分:10)

我知道一年过时了,但我使用这种方法来阅读每个设置:

Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
ConfigurationSectionGroup csg = config.GetSectionGroup("applicationSettings");
ClientSettingsSection c = (ClientSettingsSection)csg.Sections["Add your section name here, e.g. Your.Namespace.Properties.Settings"];
foreach (SettingElement e in c.Settings)
{
    Debug.WriteLine("SETTING NAME: " + e.Name);
    SettingValueElement v = e.Value;
    Debug.WriteLine("SETTING VALUE: " + v.ValueXml.InnerText);
}

这适用于在类库项目中创建的设置文件。设置文件应命名为“YourLibrary.dll.config”,然后部署在库的位置。设置文件应具有与此类似的内容:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="Your.NameSpace.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <Your.NameSpace.Properties.Settings>
      <setting name="YourLibrary_WebReferences_YourWebService" serializeAs="String">
        <value>http://localhost:3861/YourWebService.asmx</value>
      </setting>
      <setting name="AnotherSetting" serializeAs="String">
        <value>False</value>
      </setting>
    </Your.NameSpace.Properties.Settings>
  </applicationSettings>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

我不需要从配置文件中读取连接字符串,但是应该可以通过更改打开exe配置后获得的节组的名称来实现。

我需要这样做的原因是我有一个用户控件,它包装一个ActiveX / COM库,然后在IE中以“object”标签托管。我已经使用了“param”标签,所以我可以使用该机制将设置传递给用户控件,但这种方法在当时似乎是一个合乎逻辑的选择。另外,我不会让这个特殊问题打败我!

HTH pridmorej:)

答案 1 :(得分:5)

我认为你在寻找:

ConfigurationManager.OpenExeConfiguration(string exePath)

ConfigurationManager.OpenMappedExeConfiguration(
    new ExeConfigurationFileMap() { 
        ExeConfigFilename = path + "app.config" 
    }, ConfigurationUserLevel.None);

返回Configuration个对象。 MSDN doc on ConfigurationManager

尝试this question了解如何获取DLL路径。

答案 2 :(得分:2)

使用企业库共享配置源”和“差异配置”(用于轻松切换)可以很好地解决此类配置问题在多种环境之间等。)。

要了解高级配置方案,请尝试从此处开始:

http://msdn.microsoft.com/en-us/library/ff664552(v=pandp.50).aspx

要在 Visual Studio 中集成企业库配置工具(GUI),请尝试此处:

http://visualstudiogallery.msdn.microsoft.com/029292f0-6e66-424f-8381-3454c8222f9a

学习曲线起初可能看起来有点压倒性,但值得付出努力,特别是如果您正在处理复杂的企业生态系统。集成工具实际上可以很容易地设置一个非常复杂的配置系统,并在需求变化时对其进行管理。

BTW:一旦你掌握了它,你可能最终想要使用它远远超过你的连接字符串!

答案 3 :(得分:2)

ConfigurationManager.OpenExeConfiguration对我没用。

但是,Properties.Settings.Default.<SettingName>运作良好。

答案 4 :(得分:1)

是否可以从每个Web服务的配置中引用库的配置文件? .NET中有一个类似于XML的机制:

Use XML includes or config references in app.config to include other config files' settings

http://blog.andreloker.de/post/2008/06/Keep-your-config-clean-with-external-config-files.aspx

虽然您仍然需要编辑每个web.config,但实际内容仍保留在一个位置。

答案 5 :(得分:1)

您可以使用支持多种数据源的开源Config.Net库,包括您的https://github.com/aloneguid/config

答案 6 :(得分:0)

您可以从托管应用程序的web.configapp.config中读取类库的配置设置。

如果在控制台应用程序中引用了类库,则将类库需要的设置放在控制台应用程序的app.config中(例如在appSettings下),并使用{{1下的ConfigurationManager从类库中读取它}}

如果在Web应用程序中引用了类库,则将类库中所需的设置放在Web应用程序的System.Configuration中(例如在appSettings下),并使用{{1下的ConfigurationManager从类库中读取它}}