Windows 服务配置文件 C#

Posted

技术标签:

【中文标题】Windows 服务配置文件 C#【英文标题】:Windows Service Config File C# 【发布时间】:2010-10-01 03:50:11 【问题描述】:

我使用 Visual Studio 2008 / C# 开发了一个 Windows 服务应用程序。

我在项目中有一个 app.config 文件。安装后,app.exe.config 文件出现在可执行文件旁边,但当我尝试通过 ConfigurationManager.AppSettings 访问它们时,它似乎没有从中读取值。

它是把配置文件复制到别处还是有其他我不知道的问题?

提前致谢,

马丁。

编辑: 配置文件名实际上是 my_exe_file_name.exe.config,它看起来像:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>

    <add key="RuntimeFrequency" value="3" />

  </appSettings>
</configuration>

我正在尝试通过以下方式阅读:

ConfigurationManager.AppSettings["RuntimeFrequency"]

我经常看到的调试值是“1”而不是“3”。我在这里做错了吗?

【问题讨论】:

【参考方案1】:

我找到了错误,它与文件权限有关。安装服务后,我的本地用户帐户无权修改 app.exe.config 文件。

我用来编辑的工具没有通知我它被拒绝访问以保存文件 - 如果有人感兴趣,那就是记事本++ - 所以我看不出它没有保存旧的配置文件。

现已解决,谢谢大家。

马丁。

【讨论】:

OP,请接受一个答案,这样它就不会一直出现在“未回答”的 SOF 查询中。 @granadaCoder 它不应该显示在“未回答”部分,因为它有一个赞成的答案;看来原发帖人的账号已经“消失”了,所以无法接受答案……【参考方案2】:

当您处于调试模式时,请检查 my_exe_file_name.vshost.exe.config 中的设置并确保您在 app.config 文件中进行了调整。 Visual Studio 应该更新 bin/debug 文件夹中的最终配置文件。

【讨论】:

【参考方案3】:

也许您正在更新错误的配置文件。你应该仔细检查使用

System.Configuration.ConfigurationManager.OpenExeConfiguration(PATH_TO_CONFIG);

【讨论】:

【参考方案4】:

一般对于我编写的 Windows 服务,我将 appName.exe.config 文件放入 C:\WINDOWS\system32\

也许你在那个目录中有一个旧版本,这是你的服务获取价值的地方,即使你已经更新了项目中的配置文件。

【讨论】:

嗯,svchost.exe 运行windows 服务。并且 svchost.exe 存在于 %WINDIR%\System32 目录中。因此,将首先在该目录中搜索 myapplication.exe.config 文件。如果我错了,请纠正我。 如果您使用ConfigurationManager.AppSettings["my_var"],则不需要将您的 App.config 复制到 System32。如果你需要这样做,那是有问题的。如果您需要知道您的服务的 .exe 路径:System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase @DaveBaghdanov svchost 不运行 所有 服务;您仍然可以将它们托管在自己的 EXE 中【参考方案5】:

App.config 文件应重命名为 your_exe_file_name.exe.config 并放在 exe 文件附近。

【讨论】:

【参考方案6】:

是否有可能定义了多个 RuntimeFrequency 条目的实例? ConfigurationManager 从上到下读取文件并单独处理每个设置。因此,文件中定义的 RuntimeFrequency 的最后一个值就是它将使用的值。

如果您想确定是否正在使用您的文件,我会简单地删除或注释掉 RuntimeFrequency 的任何定义(确实会发生复制/粘贴错误)并等待在 ConfigurationManager 尝试引用条目时看到应用程序错误在 AppSettings 中不存在。

【讨论】:

以上是关于Windows 服务配置文件 C#的主要内容,如果未能解决你的问题,请参考以下文章

Windows Worker 服务文件夹权限 (C#)

C#中利用Windows的API读写配置参数文件

c#创建安装卸载调试windows服务的简单事例

在 Windows 窗体 C# 应用程序中拥有配置文件的最简单方法

为 Windows 服务 C# 提供版本号

C# Windows 服务 - 从 ini 或 App.config 文件中读取