将 app.config 与类库一起使用
Posted
技术标签:
【中文标题】将 app.config 与类库一起使用【英文标题】:Using app.config with a class library 【发布时间】:2010-10-15 23:23:24 【问题描述】:我经常需要创建一个 .Net 类库,该类库需要一个 app.config 来处理数据库连接字符串等内容。但是,这些设置必须在调用应用程序的 app.config 或 web.config 中。如果我想将 DLL 分布在多个应用程序中,那就很麻烦了,因为我必须将这些设置复制到每个应用程序的 app.config 中。
我考虑过通过类库中的代码手动读取配置设置,但这也是一个主要的痛苦。有人对在类库中加载 app.config 设置的最佳方式有任何建议吗?
【问题讨论】:
create your own settings in xml的可能重复 【参考方案1】:我知道这不是您想听到的,但入口点的配置文件是放置这些设置的合理位置。如果每个库都需要自己的配置文件,那么必须编辑每个文件而不是一个文件会很乏味。
我会有一个包含默认设置的文本文件,作为库的一部分(以及项目的一部分),它可以与库一起分发以进行默认设置配置(可以复制并粘贴到配置文件中) )。
【讨论】:
这将成为一个皇家 PITA,用于类似项目的 Web 服务引用,您可以在其中不断更新引用并不断更新关联的 app.config 文件。我不同意您的分析 - 我说将 Web 服务设置保留在类库中比任何引用它更有意义。 @Jez 那么您应该将其作为答案提出。不同意是可以的,但要提出理由。 =) 也就是说,问题是您必须采取手动步骤才能更新此外部配置文件,而 app.config 文件不需要这些步骤。此外,如果您必须在一个应用程序而不是另一个应用程序中切换端点(在企业环境/内部网络中更需要关注),则为 library 提供单独配置文件的一般方法会惨遭失败,因为进行这些更改所需的手动更新。 好吧,在这种情况下更好的是 引用 配置覆盖类库中给出的“默认”配置。真正糟糕的是类库中的配置被完全忽略了。我不把它作为答案,因为它不是问题的答案。我希望我知道如何将app.config
与类库一起使用。【参考方案2】:
您可以做的一件事是为您的库创建一个单独的设置文件,然后您只需在入口应用程序配置文件中引用它。
有关这方面的信息,请参阅 this question 中的 accepted answer。
【讨论】:
【参考方案3】:让每个类库在自定义 ConfigurationSection 中定义配置设置。
然后将自定义节处理程序添加到您的 process.exe.config 文件中。
This MSDN article 的解释非常全面,VB 和 C# 都有示例。
这涉及编写一些非常重复的代码 - Dmitryr 创建了this tool 以从 XML 配置的片段生成配置部分,这可能会有所帮助。
【讨论】:
【参考方案4】:这是另一种选择。
首先不要尝试寻找“合并”您的 app.configs 的方法,或者甚至将配置项放在您的 DLL 中(并尝试解决“按设计”的问题),试试这个:
创建您的 DLL,但在您需要配置项的地方,创建一个公共属性。当您在 DLL 中实例化该类时,您使用来自所属应用程序的配置项填充这些属性。
现在配置在所有者级别进行管理,并且 DLL 是可移植的,因为您必须在运行时将所需的内容传递给它。
没有更多的 DLL.config!
【讨论】:
使用类库的全部意义在于不必让宿主应用程序开发人员必须了解所有这些事情。 “现在配置在所有者级别进行管理”正是我们试图避免的。【参考方案5】:转到应用程序属性 -> 设置选项卡;在那里添加您的设置。
使用Properties.Settings.Default.<SettingName>
访问设置。就是这样!
【讨论】:
如何在不重新编译项目的情况下更改值?我已经更改了配置文件中的值,但是调用应用程序在调用库时没有得到配置文件的新值而是旧的值【参考方案6】:为每个类库使用自己的配置文件不是(大)问题。如果您使用 vb.net,您可以通过“设置”页面上的“我的项目”面板添加值。
您唯一需要做的就是在您的类库设置上调用“My.Settings.Save”(而不仅仅是在您的主应用程序设置文件上)。
这也适用于 c#(但可能需要更多的手动工作)。
【讨论】:
【参考方案7】:如果您使用的是 NUnit,请将您的 app.config 文件命名为与您的 *.nunit 项目文件名相同的名称。例如,如果您将项目命名为“ClassLibraryA.nunit”,则将您的类库配置文件命名为“ClassLibraryA.config”。它们还需要驻留在同一文件夹/目录中。 NUnit其实就是用这个作为主配置文件的。
如果您有自定义代码,那么您需要确保您的 app.config(或 web.config)引用了类库的 app.config 文件。应用程序只关心根 app.config 或 web.config。所以你需要添加一个指向类库 app.config 的自定义配置部分。
【讨论】:
【参考方案8】:您可以创建自己的 XML 文件(如果需要,可以将其称为 appConfig.xml 或其他名称),使用 System.Xml 而不是 System.Configuration 来读取它,并将其与您的 dll 一起包含。
【讨论】:
【参考方案9】:在不同的解决方案中创建您的类库。如果将它们保留在同一个解决方案中,则将读取最高层次结构的 app.config。
【讨论】:
以上是关于将 app.config 与类库一起使用的主要内容,如果未能解决你的问题,请参考以下文章
在类库的 App.config 中使用 ConfigurationManager.GetSection
为啥这个类库 dll 没有从 app.config 获取信息
Visual Studio/MSBuild 将引用的类库的 app.config 作为 *.dll.config 复制到当前项目的 bin 文件夹