Что я делаю для своих установщиков, так это использую атрибут «file» в App.Config. Блок appSettings принимает атрибут «file», например:
<appSettings file="user.config">
<add key="foo" value="some value unchanged by setup"/>
</appSettings>
Атрибут «file» похож на CSS, в котором побеждает наиболее специфическая настройка. Если вы определили «foo» в user.config, а также в App.config, используется значение в user.config.
Затем у меня есть генератор конфигурации, который записывает второй блок appSettings в user.config (или как вы хотите его называть), используя значения в словаре.
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace Utils
{
public class ConfigGenerator
{
public static void WriteExternalAppConfig(string configFilePath, IDictionary<string, string> userConfiguration)
{
using (XmlTextWriter xw = new XmlTextWriter(configFilePath, Encoding.UTF8))
{
xw.Formatting = Formatting.Indented;
xw.Indentation = 4;
xw.WriteStartDocument();
xw.WriteStartElement("appSettings");
foreach (KeyValuePair<string, string> pair in userConfiguration)
{
xw.WriteStartElement("add");
xw.WriteAttributeString("key", pair.Key);
xw.WriteAttributeString("value", pair.Value);
xw.WriteEndElement();
}
xw.WriteEndElement();
xw.WriteEndDocument();
}
}
}
}
В вашем установщике просто добавьте что-то вроде следующего в ваш метод Install:
string configFilePath = string.Format("{0}{1}User.config", targetDir, Path.DirectorySeparatorChar);
IDictionary<string, string> userConfiguration = new Dictionary<string, string>();
userConfiguration["Server"] = Context.Parameters["Server"];
userConfiguration["Port"] = Context.Parameters["Port"];
ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration);
Мы используем его для наших тестовых, обучающих и производственных серверов, поэтому все, что нам нужно сделать, это указать имя машины и пароль во время установки, и обо всем позаботимся за нас. Раньше это был 3-часовой процесс, включающий прохождение нескольких файлов конфигурации для установки паролей. Теперь это почти полностью автоматизировано.
Надеюсь, это поможет.