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

Dim*_*ima 7 c# vb.net windows-services app-config .net-4.0

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

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

<?xml version="1.0" encoding="utf-8" ?>
  <configuration>
     <connectionStrings>
       <clear />
       <add name="myLocalMySQLDBUsername" connectionString="username"/>
     </connectionStrings>
  </configuration>
Run Code Online (Sandbox Code Playgroud)

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

  • ConfigurationManager.ConnectionStrings( "myLocalMySQLDBUsername").的ConnectionString

抛出空引用错误,因为我的连接字符串未加载.加载的唯一connectionStrings来自位于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部分,但配置管理器也没有读取这些设置(count = 0).

更新2:

根据建议,我尝试手动打开app.config文件,如下所示:

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

Dim myConfig As Configuration = ConfigurationManager.OpenExeConfiguration(exePath)
Run Code Online (Sandbox Code Playgroud)

所以这是奇怪的部分,当我查看内部,路径是正确的(指向我的app.config)但仍然从machine.config文件加载connectionStrings(我的connectionStrings没有加载)!哎呀

更新3:

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

谢谢大家的帮助!

Jos*_*hua 5

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

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

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