启动Windows服务时找不到app.config

时间:2012-09-28 21:46:34

标签: c# windows service app-config

我在Windows 7上运行了一个CSharp Windows服务。它从一个用于设备管理的框架中实例化一个dll。这个dll有一些存储在名为'pm.config'的app.config中的设置。

我将所有程序集和pm.config文件复制到winsvc项目文件夹的同一级别的名为“bin”的文件夹中。

我添加了对dll框架的引用并编译了该项目。 pm.config文件存在于'bin \ debug'和'bin \ release'子文件夹中。我使用installutil安装了winsvc并启动了winsvc。一切都很顺利,除了当winsvc从框架dll调用'Initialize'方法时,此方法尝试打开pm.config文件并生成以下异常:

InnerException = {"The machine.config file 'pm.config' was not found.\r\nParameter name: machineConfigFilename"}

我使用Assembly.GetExecutingAssembly().Location检查了装配位置 它指向winsvc项目的正确文件夹,我的意思是'mysvcproject \ bin \ debug'文件夹。

我很确定这与winsvc的安全上下文有关,但我不知道。我正在使用LocalService帐户启动winsvc,而'bin \ debug'对此帐户没有权利。相反,我完全控制了此文件夹中的所有帐户,但仍然出现错误。

我完全迷失了,有人可以帮助我吗?

提前致谢

4 个答案:

答案 0 :(得分:3)

我不久前在部署Windows服务时遇到过类似的问题。问题是Windows服务期望文件位于c:\ windows \ system32。而不是使用Assembly.GetExecutingAssembly()。要检查的位置,尝试Directory.GetCurrentDirectory()并查看是否产生相同的结果。如果没有,请尝试将pm.config文件放在当前目录中。

答案 1 :(得分:1)

App.config文件名必须与Windows服务器可执行文件的文件名匹配,并且“.config”已安装。因此,如果您的服务是“pm.exe”,则您的配置文件应为“pm.exe.config”。

答案 2 :(得分:0)

正在执行的应用程序使用自己的app.config,而不是您引用的dll中的app.config。您应该在执行程序集中创建一个app.config并将设置放在那里。

App.config for dll

答案 3 :(得分:0)

我成功地将Daniel的解决方案与此解决方案相结合:https://stackoverflow.com/a/7262937/771473

Configuration cfg = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
String MyValue = cfg.AppSettings.Settings["MyKey"].Value;