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

18
我有一个.NET类库,提供一组帮助函数,被多个Web服务使用。该类库必须存储单个设置,即连接字符串,这不需要被Web服务本身看到,因为它们都必须查询同一个数据库。
不幸的是,.NET没有提供轻松读取DLL的app.config文件的方法。唯一“简单”的解决方案是在每个Web服务配置文件中存储连接字符串,这完全是错误的。
通常,我关注代码的优雅性,但这次我确实需要一个解决方案,即使它是一个hack。是否有任何方法使.NET类库拥有自己的配置?
编辑:从技术上讲,我可以将所有这些Web服务合并成一个Web服务。但是,由于业务原因(每个Web服务将单独出售),我不能这样做。

@k3b:不是的。在我的情况下,这个DLL被多个Web服务所使用。如果我决定将DLL的连接字符串存储在每个Web服务的配置文件中,那么每当需要更改连接字符串时,我都必须在每个Web服务中更改该设置。 - isekaijin
可能是重复的问题:如何在类库中使用app.config - marc_s
7个回答

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库,然后在“object”标记中由IE托管。我已经让“param”标记起作用了,所以我本可以使用该机制将设置传递给用户控件,但当时这种方法似乎是一个合乎逻辑的选择。此外,我也不会让这个特定的问题打败我!

希望这对pridmorej有帮助 :)


5

我想您正在寻找:

ConfigurationManager.OpenExeConfiguration(string exePath)

或者

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

该方法返回一个Configuration对象。有关ConfigurationManager的详细信息,请参阅MSDN文档

尝试此问题以获取DLL路径。


我不这么认为。如果你在一个Web应用程序中,你可以使用Server.MapPath来获取绝对路径,否则你需要使用Environment.CurrentDirectory或类似的方法。 - s_hewitt
它获取当前工作目录,因此它将基于应用程序而不是 DLL。 - s_hewitt
@s_hewitt:不幸的是,.NET Web Service可执行文件本身就是DLL。 - isekaijin
添加了一个链接到一个问题,该问题获取当前的DLL路径。 - s_hewitt
@s_hewitt:我需要引用哪些程序集?(我的政策是尽量少引用程序集。) - isekaijin
显示剩余2条评论

2

ConfigurationManager.OpenExeConfiguration 对我来说不起作用。

但是,Properties.Settings.Default.<SettingName> 很好用。


2
这种配置问题可以通过使用“企业库”中的“共享配置源”和“差异配置”(用于轻松切换多个环境等)来很好地解决。
要了解更高级的配置方案,请从这里开始:

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

并且要将企业库配置工具(GUI)集成到Visual Studio中,请尝试这里:

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

学习曲线一开始可能会让人感到有些压力,但是它非常值得努力,特别是当你处理复杂的企业生态系统时。集成工具实际上使得设置一个非常复杂的配置系统变得非常容易,并且可以在您的要求发生变化时进行管理。
顺便说一下:一旦你掌握了它,你可能会想用它来做更多的事情,而不仅仅是连接字符串!

1

1

每当我创建一个新的Web服务(这种情况相当频繁),我仍然需要记得将库的配置文件包含到Web服务的配置中。 - isekaijin

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接