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

问题描述 投票:0回答:8

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

不幸的是,.NET 没有提供轻松读取 DLL 的

app.config
文件的方法。唯一“简单”的解决方案是将连接字符串存储在每个Web服务配置文件中,这完全是胡说八道。

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


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

.net configuration configuration-files class-library
8个回答
11
投票

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

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
投票

我想你正在寻找:

ConfigurationManager.OpenExeConfiguration(string exePath)

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

它返回一个

Configuration
对象。 ConfigurationManager 上的 MSDN 文档

尝试这个问题了解如何获取DLL路径。


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

学习曲线一开始可能看起来有点难以承受,但这是非常值得的,特别是当您正在处理“复杂的企业生态系统”时。该集成工具实际上使设置非常复杂的配置系统变得非常容易,并根据您的需求变化进行管理。 顺便说一句:一旦掌握了它的窍门,您可能最终会想将它用于更多的用途,而不仅仅是连接字符串!


2
投票
ConfigurationManager.OpenExeConfiguration

对我不起作用。


但是,

Properties.Settings.Default.<SettingName>

效果很好。

    


1
投票

在app.config中使用XML包含或配置引用来包含其他配置文件的设置

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

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


1
投票
https://github.com/aloneguid/config


0
投票
web.config

app.config
读取类库的配置设置。

如果在控制台应用程序中引用类库,请将类库所需的设置放入控制台应用程序的 app.config 中(例如在 appSettings 下),并使用

System.Configuration

下的 ConfigurationManager 从类库中读取它。


如果在 Web 应用程序中引用了类库,请将类库所需的设置放在 Web 应用程序的

web.config

中(例如在 appSettings 下),并使用

System.Configuration
下的 ConfigurationManager 从类库中读取它。
    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.