通过自定义msi安装程序修改app.config

时间:2013-01-03 08:31:34

标签: c# .net windows-installer app-config

我需要在app.config中创建一个地址字符串:

<client>
       <endpoint address="http://ServerName/xxx/yyy.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IClientIInfoService"
                    contract="DocuHealthLinkSvcRef.IClientIInfoService" name="BasicHttpBinding_IClientIInfoService" />
</client>

安装期间用户需要输入ServerName。 为此,我在安装程序中创建了一个新的UI对话框。我还撰写了Installer.cs课程并将install ()改为:

public override void Install(System.Collections.IDictionary stateSaver)
        {

            base.Install(stateSaver);

            string targetDirectory = Context.Parameters["targetdir"];

            string ServerName = Context.Parameters["ServerName"];

            System.Diagnostics.Debugger.Break();

            string exePath = string.Format("{0}myapp.exe", targetDirectory);

           Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);

            config.AppSettings.Settings["ServerName"].Value = ServerName;

            config.Save();
        }
    }

但是如何在ServerName中使用此app.config来创建指定的字符串。 我正在研究VS2010。

5 个答案:

答案 0 :(得分:5)

您可以使用WiX (Windows Installer XML toolset)来构建MSI,在这种情况下,您可以使用XmlFile实用程序标记来更新服务器名称:

  <util:XmlFile Id="UpdateServerName" File="[INSTALLLOCATION]AppName.exe.config" Action="setValue" ElementPath="/client/endpoint" Name="address" Value="http://[SERVERNAME]/xxx/yyy.svc" />

您可以使用WixUI扩展程序表单在安装期间捕获服务器名称。

WiX的优点:WiX符合msbuild(与.vdproj文件不同),并且可以对您的安装程序进行更精细的控制,among other things

答案 1 :(得分:3)

假设您正在app.config

中使用完整的ServiceModel部分组

基本上,您按照以下步骤操作:

  1. 加载ServiceModel配置部分
  2. 获取客户部分
  3. 获取ChannelEndpoint元素
  4. 通过将字符串“ServerName”替换为输入值
  5. 来更改地址值
  6. 将地址属性设置为新值
  7. 保存配置

    public override void Install(System.Collections.IDictionary stateSaver)
    {
    
        base.Install(stateSaver);  
    
        string targetDirectory = Context.Parameters["targetdir"];  
    
        string ServerName = Context.Parameters["ServerName"];  
    
        System.Diagnostics.Debugger.Break();  
    
        string exePath = string.Format("{0}myapp.exe", targetDirectory);  
    
        Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);  
    
        config.AppSettings.Settings["ServerName"].Value = ServerName;  
    
        //Get ServiceModelSectionGroup from config  
        ServiceModelSectionGroup group = ServiceModelSectionGroup.GetSectionGroup  (config);
    
        //get the client section
        ClientSection clientSection = group.Client;
    
        //get the first endpoint
        ChannelEndpointElement channelEndpointElement = clientSection.Endpoints[0];
    
        //get the address attribute and replace servername in the string.
        string address = channelEndpointElement.Address.ToString().Replace("ServerName", ServerName);
    
        //set the Address attribute to the new value
        channelEndpointElement.Address = new Uri(address);
    
        config.Save();
    }
    

答案 2 :(得分:2)

在一天结束时,app.configxml个文件。您可以使用Linq To XMLXPathNavigator替换address元素的endpoint属性。

以下代码使用Linq to Xml

    using System.Xml.Linq;
    public override void Install(System.Collections.IDictionary stateSaver)
    {

        base.Install(stateSaver);

        string targetDirectory = Context.Parameters["targetdir"];

        string ServerName = Context.Parameters["ServerName"];

        System.Diagnostics.Debugger.Break();

        string configPath = string.Format("{0myapp.exe.config", targetDirectory);

        XElement root = XElement.Load(configPath);
        var endPointElements = root.Descendants("endpoint");
        foreach(var element in endPointElements)
        {
            element.Attribute("address").Value = ServerName;
        }
        root.Save(configPath);
    }
}

答案 3 :(得分:2)

由于你有一个windows-installer标签,我假设你有一个MSI包,或者可以创建一个......

然后:

  • 您可以创建所需的公共MSI属性,如ENDPOINTSERVER 在安装过程中
  • 添加修改app.config的自定义操作 在“InstallFinalize”之后运行,其值为ENDPOINTSERVER

可以使用以下方式进行静默安装:

msiexec /i app.msi ENDPOINTSERVER=www.MyServer.com /qb-

答案 4 :(得分:2)

在保存配置文件更改之前尝试使用以下两行:

config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("Section Name");
 root.Save(configPath);

P.S:如果你用F5运行它,它不会更新解决方案项'app.config',而是更新bin /文件夹中的'.exe.config'。