如何在.net 4.0中使用configurationManager从App.config中读取值
本文关键字:configurationManager App config 读取 net | 更新日期: 2023-09-27 17:49:40
我正在用。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
抛出空引用错误,因为我的连接字符串没有加载。唯一加载的connectionstring来自机器。' windows 'Microsoft.NET'Framework'v4.0.30319' config 'machine.config
如果我为服务创建一个应用程序范围设置,我可以通过使用My.Settings.setting ->来获得该设置,这样就不会像App.config文件不被读取一样。
我的问题是:为什么我的connectionStrings没有从App.config文件加载?
谢谢你的帮助。
更新:
同样,在这一点上,即使是一个解决方案也会受到赞赏;使用app.config的唯一原因是能够使用DpapiProtectedConfigurationProvider加密内容(内容将为服务和数据库连接提供一些用户名/密码值)。
我尝试在app.config中手动创建一个AppSettings部分,但这些设置也没有被configurationManager读取(count = 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),但connectionStrings仍然从机器加载。配置文件(我的connectionStrings没有加载)!!啊
更新3:好吧,我明白了。当从另一个项目(子项目)引用一个项目(父项目)时,即使使用了父项目(子项目)的类,也会使用子项目的app.config。因此,如果我将connectionStrings复制到子应用程序的app.config中,我就可以让它们显示出来。当尝试手动打开它时,我的currentDirectory是子目录,而不是父目录(奇怪的是它没有抛出异常-它无法找到配置文件…它只是默默地使用机器。配置…哦)。
谢谢大家的帮助!
您要做的第一件事是确保服务帐户能够访问该文件(如果不是作为SYSTEM运行的话)。听起来应该没问题,不过既然你提到了My.Settings.Setting works。
另一件要注意的事情是确保app.config中有服务可执行文件的名称-所以如果服务exe是MyService.exe, app.config必须命名为MyService.exe.config。
最后要注意的是:库将从加载库的可执行文件的app.config中读取,而不是从库中读取app.config。因此,如果您有一个服务可执行程序MyService
的项目和一个库MyServiceLibrary
的项目,库中的代码将从MyService
而不是MyServiceLibrary
读取app.config。
我看到一些人说这个问题可以通过手动重新添加System.Configuration.dll
的引用来修复
旁注:如果这真的是你的整个app.config文件,而不仅仅是一个片段,那么这是你的问题…你的app.config文件应该更复杂,否则。net将无法加载它。
解决方法:使用配置管理器打开这个配置文件(有一个API)。你不能让它自动加载,只是告诉配置管理器打开它。我仍然认为问题是你的配置文件无效-你能发布完整的文件吗?
确保将配置文件部署到与可执行文件相同的文件夹中,并将其命名为your.assembly.exe.config.
我也遇到过类似的问题,但在我的情况下,这是因为我更改了项目的名称空间。这也用作配置文件中的应用程序设置节元素名称,因此代码没有找到新的节名称。在项目属性和重建中摆弄一个自定义设置的值,导致新部分与旧部分一起写入app.config,这就是向我指出问题的原因。