在安装时提供配置设置

问题描述:

我已经创建了一个通过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工作,准确地指定设置文件路径(因为在这个环境中也没有有用的默认工作目录)。