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

如何使.NET类库读取自己的配置文件?,.net,configuration,configuration-files,class-library,.net,Configuration,Configuration Files,Class Library,我有一个.NET类库,它提供了一组由多个Web服务使用的帮助函数。该类库必须存储单个设置,特别是连接字符串,Web服务本身不需要看到这些设置,因为它们都必须查询相同的数据库 不幸的是,.NET无法轻松读取DLL的app.config文件。唯一“简单”的解决方案是将连接字符串存储在每个Web服务配置文件中,这完全是胡说八道 通常,我关心代码的优雅,但这次我真的需要一个解决方案,即使它是一个黑客。有没有办法让.NET类库有自己的配置 编辑:从技术上讲,我可以将所有这些Web服务合并到一个Web服务

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

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

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



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

我想您正在寻找:

ConfigurationManager.OpenExeConfiguration(string exePath)

返回一个对象


尝试获取DLL路径。

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


虽然您仍然需要编辑每个web.config,但实际内容保存在一个地方。

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

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


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

下的ConfigurationManager从类库中读取该设置,我知道该设置已过期一年,但我使用此方法读取每个设置:

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>

http://localhost:3861/YourWebService.asmx
假的
我不需要从配置文件中读取连接字符串,但这应该可以通过更改打开exe配置后获得的节组的名称来实现

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


HTH pridmorej:)

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

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

要在Visual Studio中集成企业库配置工具(GUI),请尝试以下操作:

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


顺便说一句:一旦你掌握了它的窍门,你可能会想要用它来做更多的事情,而不仅仅是你的连接字符串

您可以使用opensource Config.Net库,它支持多种数据源,包括您的数据源配置管理器
ConfigurationManager.OpenExeConfiguration
对我不起作用


但是,
Properties.Settings.Default.
工作得很好。

我不这么认为。如果您在web应用程序中,可以使用
Server.MapPath
获取绝对路径,否则需要使用
Environment.CurrentDirectory
或类似工具。@s_hewitt:Environment.CurrentDirectory是否适用于DLL?它获取当前工作目录,因此它将基于应用程序,不是我相信的DLL。@s_hewitt:不幸的是,.NET Web服务可执行文件本身就是DLL。添加了一个链接,指向获取当前DLL的问题path@k3b:否。在我的例子中,DLL被多个Web服务使用。如果我决定将DLL的连接字符串存储在每个Web服务的配置文件中,则每当需要更改连接字符串时,我必须在每个Web服务中更改该设置。每当我创建新Web服务时(这是非常常见的),可能会重复此设置,我仍然需要记住将库的配置文件包括到Web服务的配置中。
<?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>