在安装时提供配置设置
问题描述:
我已经创建了一个通过MSI安装的Windows服务。该服务需要主机/ IP,端口和路径与VS2017 Settings.settings中作为单独属性添加的通信进行通信。我现在想让安装程序接受用户输入并将设置写入我的配置文件。首先,我试过如下:在安装时提供配置设置
public override void Install(IDictionary stateSaver)
{
string server;
string port;
string path;
base.Install(stateSaver);
server = this.Context.Parameters["SERVER"];
port = this.Context.Parameters["PORT"];
path = this.Context.Parameters["PATH"];
Properties.Settings.Default.server = server;
Properties.Settings.Default.port = port;
Properties.Settings.Default.path = path;
Properties.Settings.Default.Save();
}
而且从我的app.config文件的摘录...
<userSettings>
<myService.Properties.Settings>
<setting name="server" serializeAs="String">
<value />
</setting>
<setting name="port" serializeAs="String">
<value />
</setting>
<setting name="path" serializeAs="String">
<value />
</setting>
</myService.Properties.Settings>
</userSettings>
这不保存设置,所以我使出谷歌。我发现的最接近的东西是this question,但是我并不完全理解它的含义(我对C#很陌生)。我是否使用完整的ServiceModel节组?我确信我能弄清楚如何直接编辑XML,但这会是一种闪避,而不是正确的方式,我宁愿这样做。
答
一般的问题是安装程序类是使用反射来实例化的,它是由执行安装的msiexec服务调用的C++ shim Dll实现的。在这种环境下,当程序集和可执行文件“正常”加载时,自动执行的东西不会发生。换句话说,你必须自己完成Xml工作,准确地指定设置文件路径(因为在这个环境中也没有有用的默认工作目录)。