默认值用于My.Settings而不是app.config中的默认值(对于Windows服务)

时间:2010-11-23 07:23:40

标签: vb.net windows-services application-settings

用VB.NET编写的Windows服务使用My.Settings命名空间来简化。只有三个设置可供读取,并且这些设置在ServiceLauncher的构造函数中读取。

我正在尝试安装服务:

installutil GID.ServiceLauncher.exe

这是成功的,但是它使用的配置设置不是GID.ServiceLauncher.exe.config文件中的配置设置,而是使用在应用程序中烘焙的设置作为Settings.Designer.vb中的默认设置(标有DefaultSettingValueAttribute)。 [Microsoft不允许开发人员忽略默认设置的可疑智慧完全是另一个问题]

如何进一步诊断此问题,并强制重新加载设置?我试过调用My.Settings.Default.Reload,但这没有做任何事。所有设置均为应用程序设置,仅与自动生成文件中的“值”不同。

我已经使用System.Diagnostics.Debugger.Launch()成功附加了调试器,并且足够真实,设置仍然是默认设置。

在预期问题时,背景:需要配置设置的原因是因为这是一个非常直接的服务,它只是执行一个exe;这个exe在可配置的位置。还有其他原因,例如我希望服务名称可以配置而无需重新编译。

3 个答案:

答案 0 :(得分:1)

我发现因为安装程序在与InstallUtil.exe相同的进程中运行,所以找不到Windows服务的配置文件。 类似文章here on msdn

因此,我推出了自己的简单解决方案,灵感来自this。请参阅下面的新代码:

Friend Function GetConfigurationValue(ByVal key As String) As String
    Dim service = System.Reflection.Assembly.GetAssembly(GetType(ProjectInstaller))
    Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(service.Location)
    Dim keyValue As String = config.AppSettings.Settings(key).Value

    If String.IsNullOrEmpty(keyValue) Then
        Throw New IndexOutOfRangeException(String.Format("Settings collection does not contain the requested key:[{0}]", key))
    End If

    Return keyValue
End Function

替代解决方案:

Passing parameters in to InstallUtil
Daenibuq (another abstraction on wrapping System.ServiceProcess)

答案 1 :(得分:0)

当您访问设置时,是否写了My.Settings.Default.MySetting?如果是,请尝试将其更改为My.Settings.MySetting

答案 2 :(得分:0)

您是否手动更改了app.config文件中的设置。如果是这样,只有在Application设置而非User设置的情况下,才会选择这些更改。

因此,简单的解决方法是将设置范围更改为Application

更新

检查您的文件访问权限。运行该服务的帐户是否有权访问配置文件?见this related SO answer