用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在可配置的位置。还有其他原因,例如我希望服务名称可以配置而无需重新编译。
答案 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