3

我有一个在 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

4 回答 4

3

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

于 2012-09-28T21:56:15.317 回答
1

App.config 文件名必须与您的 Windows 服务可执行文件的文件名匹配,并附加“.config”。所以如果你的服务是“pm.exe”,你的配置文件应该是“pm.exe.config”。

于 2012-09-28T21:49:45.040 回答
1

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

Configuration cfg = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
String MyValue = cfg.AppSettings.Settings["MyKey"].Value;
于 2013-09-26T20:57:21.013 回答
0

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

dll 的 App.config

于 2012-09-28T22:20:25.287 回答