Windows 服务安装程序未读取 App.Config 文件

Posted

技术标签:

【中文标题】Windows 服务安装程序未读取 App.Config 文件【英文标题】:Windows service installer not reading App.Config file 【发布时间】:2011-11-29 20:09:50 【问题描述】:

我在我的项目中添加了 App.Config。 我有一个需要从 App.config 读取值的安装程序类(ProjectInstaller.cs)。 我正在提供钥匙。 以下是示例代码:

ConfigurationManager.AppSettings["CONFIG_FILE"]

当在 Installer 类中调用时,根据上面的代码,我得到空值。 但在 App.Config 文件中存在上述键的值。

【问题讨论】:

请参阅***.com/questions/379276/… 了解最新情况和最佳修复 - 您无法直接从安装程序中使用 app.config,因为您的应用程序实际上还没有运行。相反,它正在运行的是installutil。顺便提一下,当你写一个问题时,这个网站会建议可能的答案——阅读它们! 【参考方案1】:

试试:

public string GetServiceNameAppConfig(string serviceName)

    var config = ConfigurationManager.OpenExeConfiguration(Assembly.GetAssembly(typeof(MyServiceInstaller)).Location);
    return config.AppSettings.Settings[serviceName].Value;

【讨论】:

此解决方案有效,不需要安装项目。谢谢。 迄今为止最好的解决方案。【参考方案2】:

谷歌帮助:http://social.msdn.microsoft.com/Forums/ar/winformssetup/thread/896e110e-692d-4934-b120-ecc99b01c562

关键是您的安装程序单独作为 exe 运行,并且默认情况下不会加载您想象的任何名称的 app.config,因为运行安装程序的 exe 是 InstallUtil.exe 并且它最终会从文件 InstallUtil.exe.config 中搜索 appSettings,该文件不是您的,也不是您想要的,请阅读以下内容并检查链接...

如果你通过 InstallUtil 调用它,那么配置文件是 定义为 InstallUtil.exe.config 这不是您想要的。你 可以使用 Configuration 手动加载配置文件,但它会 可能有点乱

诀窍在于安装程序类的执行上下文。如果你 使用 InstallUtil 安装您的应用程序,所有代码都将在 与 InstallUtil.exe 相同的过程。如果您需要将一些数据传递给 部署期间的安装程序类,您应该使用安装参数。 它们在执行安装、提交、 执行环境的回滚和卸载方法 (安装工具,Windows 安装程序...)。您可以访问那里的参数 使用安装程序类的 InstallContex 属性。

CodeProject 上有一篇关于安装项目的优秀文章 和参数: http://www.codeproject.com/dotnet/SetupAndDeployment.asp

退房 http://msdn2.microsoft.com/en-us/library/system.configuration.install.installcontext.aspx

【讨论】:

谢谢 Davide,我在 App.Config 中定义了一些重要的关键值。我需要阅读它们。我没有办法得到它。我是否需要创建物理 xml 文件。 正如我在回答中所写的,请阅读这个:codeproject.com/KB/install/SetupAndDeployment.aspx【参考方案3】:

Davide Piras 很好地解释了为什么不能使用 app.config 并建议将值作为参数传递。

我发现了一篇关于如何将参数传递给installutil.exe 并在serviceInstallerprojectInstaller 中使用它们的好文章:

第 1 部分:Using Parameters with InstallUtil

第 2 部分:Configuring Windows Services with Parameters from InstallUtil

它非常简短地解释了如何传递参数以及如何读取它们。

【讨论】:

【参考方案4】:

对我来说,最简单的解决方案是创建 InstallUtil.exe.config 文件,并用应用程序配置文件中的内容填充它。服务安装程序已成功读取此配置文件。

我按照以下步骤创建了我的服务:Host a WCF Service in a Managed Windows Service

【讨论】:

以上是关于Windows 服务安装程序未读取 App.Config 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 App.Config 在 Windows 服务中的 WCF 命名管道

Windows 服务未显示在控制面板下的添加删除程序中

为啥在尝试安装 React 时出现“无法读取未定义的属性(读取'服务器')”?我该如何解决?

Windows 服务无法从 App.config 读取参数

MySQL:my.ini 未读取

Windows 服务未作为本地会话启动