【问题标题】:How can I make a .NET class library read its own configuration file?如何让 .NET 类库读取它自己的配置文件?
【发布时间】:2011-07-18 08:51:35
【问题描述】:

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

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

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


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

【问题讨论】:

  • @k3b:不。在我的例子中,DLL 被 几个 Web 服务使用。如果我决定将 DLL 的连接字符串存储在每个 Web 服务的配置文件中,那么每当需要更改连接字符串时,我就必须在 每个 Web 服务中更改该设置。

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


【解决方案1】:

我想你正在寻找:

ConfigurationManager.OpenExeConfiguration(string exePath)

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

返回一个Configuration 对象。 MSDN doc on ConfigurationManager

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

【讨论】:

  • 我不这么认为。如果您在 Web 应用程序中,可以使用 Server.MapPath 获取绝对路径,否则您需要使用 Environment.CurrentDirectory 或类似名称。
  • @s_hewitt:Environment.CurrentDirectory 是否适用于 DLLS?
  • 它获取当前工作目录,因此它将基于应用程序,而不是我相信的DLL。
  • @s_hewitt:不幸的是,.NET Web Service 可执行文件本身就是 DLL。
  • 添加了获取当前 DLL 路径的问题的链接
【解决方案2】:

是否可以选择从每个 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,但实际内容保存在一个地方。

【讨论】:

  • 每当我创建一个新的 Web 服务时(这很常见),我仍然需要记住将库的配置文件包含到 Web 服务的配置中。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    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 中的“对象”标签中。我已经使用了“param”标签,所以我可以使用该机制将设置传递给用户控件,但这种方法在当时似乎是一个合乎逻辑的选择。另外,我不会让这个特殊的问题打败我!

    HTH pridmorej :)

    【讨论】:

      【解决方案5】:

      使用Enterprise LibraryShared Configuration Sources”和“Differential Configurations”很好地解决了这种配置问题(方便切换多个环境等)。

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

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

      要在 Visual Studio 中集成 Enterprise Library Configuration Tool (GUI),请在此处尝试:

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

      一开始学习曲线可能看起来有点难以承受,但值得付出努力,尤其是在处理复杂的企业生态系统时。这个集成工具实际上可以很容易地设置一个非常复杂的配置系统,并在您的需求发生变化时对其进行管理。

      顺便说一句:一旦掌握了它,您可能最终会想要将它用于连接字符串之外的更多用途!

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          ConfigurationManager.OpenExeConfiguration 对我不起作用。

          但是,Properties.Settings.Default.&lt;SettingName&gt; 运行良好。

          【讨论】:

            猜你喜欢
            • 2010-10-06
            • 1970-01-01
            • 2021-05-02
            • 1970-01-01
            • 2017-04-04
            • 2010-12-05
            • 1970-01-01
            • 2017-06-20
            • 2011-02-17
            相关资源
            最近更新 更多