У меня есть проект установки Visual Studio, который имеет класс Установщика. В классе установщика я установил установку следующим образом:
MessageBox.Show(Properties.Settings.Default.MySetting);
Properties.Settings.Default.MySetting = "Foo";
Properties.Settings.Default.Save();
MessageBox.Show(Properties.Settings.Default.MySetting);
Проблема состоит в том, что даже при том, что я знаю, что этот код выполняется (я делаю другой материал), установка никогда не устанавливается!!
Окна сообщения действительно предполагают, что значение устанавливается, но когда я перехожу в .config
файл значение все еще пуст!
У кого-либо есть какие-либо идеи почему и/или возможное обходное решение?
То, что я делаю для своих установщиков, должно использовать атрибут "файла" в Приложении. Конфигурация. appSettings блок берет атрибут "файла", как так:
<appSettings file="user.config">
<add key="foo" value="some value unchanged by setup"/>
</appSettings>
Атрибут "файла" является видом подобного CSS в этом самые определенные победы установки. Если Вам определили "нечто" в 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();
}
}
}
}
В Вашем установщике просто добавьте что-то как следующее в Вашем методе Установки:
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-часовым процессом, включая прохождение через нескольких файлов конфигурации для установки паролей. Теперь это почти полностью автоматизировано.
Надеюсь, это поможет.
Хорошо в конце я сдался и имел тип RunOnce метода, чтобы сделать этот материал после того, как приложение было установлено.
Я честно не знаю, поддерживается ли это во время установщика - но если это, удостоверьтесь, что Вы звоните Save()
на Settings.Default
.