如何使用 configurationManager 从 .Net 4.0 中的 App.config 读取值?

Posted

技术标签:

【中文标题】如何使用 configurationManager 从 .Net 4.0 中的 App.config 读取值?【英文标题】:How to read values from App.config in .Net 4.0 using configurationManager? 【发布时间】:2011-08-02 07:26:11 【问题描述】:

我正在 .Net 4.0 中创建一个 Windows 服务,并通过引用服务项目使用 Windows 窗体客户端测试所述服务的某些功能。

服务项目有一个 App.config 文件,该文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
  <configuration>
     <connectionStrings>
       <clear />
       <add name="myLocalmysqlDBUsername" connectionString="username"/>
     </connectionStrings>
  </configuration>

当属于服务的函数调用时:

ConfigurationManager.ConnectionStrings("myLocalMySQLDBUsername").ConnectionString

由于未加载我的连接字符串,引发空引用错误。加载的唯一连接字符串来自位于 c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\machine.config 中的 machine.config 文件

如果我为服务创建应用程序范围设置,我可以通过使用 My.Settings.setting -> 来获取该设置,因此不会读取 App.config 文件。

我的问题是:为什么我的 connectionStrings 没有从 App.config 文件中加载?

感谢您的帮助。

更新:

此外,在这一点上,即使是变通方法也将不胜感激;使用 app.config 的唯一原因是能够使用 DpapiProtectedConfigurationProvider 加密内容(内容将包含一些用于服务和数据库连接的用户名/密码值)。

我尝试在 app.config 中手动创建 AppSettings 部分,但配置管理器也未读取这些设置(计数 = 0)。

更新 2:

根据建议,我尝试像这样手动打开 app.config 文件:

Dim exePath As String = System.IO.Path.Combine(Environment.CurrentDirectory, "ServiceName.exe")

Dim myConfig As Configuration = ConfigurationManager.OpenExeConfiguration(exePath)

所以这是奇怪的部分,当我往里看时,路径是正确的(指向我的 app.config),但仍在从 machine.config 文件加载 connectionStrings(我的 connectionStrings 未加载)!!呸

更新 3:

好的,所以,我想通了。当从另一个项目(子)引用一个项目(父)时,即使正在使用父的类,也会使用子的 app.config。因此,如果我将它们复制到孩子的 app.config 中,我可以让 connectionStrings 显示出来。当尝试手动打开它时,我的 currentDirectory 是孩子的,而不是父母的(奇怪的是它没有抛出异常 - 它无法找到配置文件......它只是默默地使用 machine.config ... 那好吧)。

感谢大家的帮助!

【问题讨论】:

可能是一个愚蠢的问题,但您如何部署服务及其 app.config?你在正确的目录中有 servicename.exe.config 吗? 我还没有部署它......一切仍在我的本地机器上调试。当我部署它时,我会确保配置文件最终位于 System32 文件夹(我认为)或 Windows 服务默认查找文件的任何文件夹中。 【参考方案1】:

您要做的第一件事是确保服务帐户有权访问该文件(如果未以 SYSTEM 身份运行)。听起来应该没问题,因为您提到 My.Settings.Setting 有效。

要注意的另一件事是确保 app.config 中包含服务可执行文件的名称 - 因此,如果服务 exe 是 MyService.exe,则 app.config 必须命名为 MyService.exe.config .

最后要注意的是:库将从加载库的可执行文件的 app.config 中读取,而不是从库中的 app.config 中读取。因此,如果您有服务可执行文件MyService 的项目和库MyServiceLibrary 的项目,则库中的代码将从MyService 而非MyServiceLibrary 读取app.config。

【讨论】:

对所有帐户都是。正确命名(我的意思是,它在编译时自动命名,并且我在调试文件夹中验证了该名称是正确的)。我考虑了将使用哪个 App.config 并得出与您概述的相同的结论 - 即服务 app.config 是使用的服务。关于为什么我的connectionStrings没有被读取,我仍然在不停地敲打我的头......叹息 我想我最初误读了您的评论/答案,但您是正确的。谢谢。 这是最接近实际答案的,但我在问题中进行了评论以使其更清楚(我认为,我希望如此)。【参考方案2】:

我看到有人说这个问题可以通过手动重新添加对System.Configuration.dll的引用来解决

旁注:如果这真的是你的整个 app.config 文件而不仅仅是一个 sn-p 那么这就是你的问题......你的 app.config 文件应该更复杂,否则 .NET 将无法加载它。

解决方法:使用配置管理器打开这个配置文件(有一个 API。)你不能让它自动加载,只需告诉配置管理器打开它。

我仍然认为问题是您的配置文件无效 -- 请您发布完整文件吗?

【讨论】:

什么意思?配置文件中的所有内容都是我粘贴到问题中的内容。实际上,我很高兴您提到了这一点,因为我没有为连接字符串设置 providerName ...这是必要的值吗?如果是,我将其设置为什么? @dima nm 关于之前的答案——试试上面的评论。 感谢您的链接;看起来我不需要 providerName。 这是目前用于测试目的的完整配置文件……真的,里面没有其他内容……你看到的是我的配置文件中的内容。现在,就手动打开文件而言,我已经编辑了我的问题以包含详细信息……谢谢……请参阅上面的详细信息。 哦,感谢您提到重新添加参考,但这是我尝试的第一件事。【参考方案3】:

确保将配置文件部署到与可执行文件相同的文件夹中,并且它的名称为 your.assembly.exe.config

【讨论】:

它是......正如我所提到的,如果我创建了一个设置,那么该设置会被毫无问题地检索到。 @Dima:用户设置未存储在 app.config 中【参考方案4】:

我遇到了类似的问题,但就我而言,这是因为我更改了项目的命名空间。这也用作配置文件中的应用程序设置部分元素名称,因此代码没有找到新的部分名称。在项目属性中摆弄自定义设置的值之一并重建导致新部分与旧部分一起写入 app.config,这对我来说是个问题。

【讨论】:

以上是关于如何使用 configurationManager 从 .Net 4.0 中的 App.config 读取值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ConfigurationManager 通过 ClickOnce 更新持久化 app.config?

如何使用 ConfigurationManager 从 appsetting 中获取连接字符串?

如何使用ConfigurationManager读写配置文件

如何使用ConfigurationManager? (Microsoft.IdentityModel.Protocols)

如何在 Azure 的 ConfigurationManager.ConnectionStrings 上使用 ConnectionStrings 创建 EF 迁移?

如何使用 configurationManager 从 .Net 4.0 中的 App.config 读取值?