Как я могу установить настройки приложения во время установки (через класс установщика) - PullRequest
6 голосов
/ 07 февраля 2009

У меня есть проект установки Visual Studio, который имеет класс Installer. В классе установщика я установил настройку следующим образом:

       MessageBox.Show(Properties.Settings.Default.MySetting);

        Properties.Settings.Default.MySetting = "Foo";
        Properties.Settings.Default.Save();

        MessageBox.Show(Properties.Settings.Default.MySetting);

Проблема в том, что, хотя я знаю, что этот код выполняется (я занимаюсь другими вещами), настройка никогда не устанавливается !!

Окна сообщений предполагают, что значение устанавливается, но когда я перехожу к файлу .config, значение все еще остается пустым!

У кого-нибудь есть идеи, почему и / или возможный обходной путь?

Ответы [ 4 ]

5 голосов
/ 12 февраля 2009

Что я делаю для своих установщиков, так это использую атрибут «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-часовой процесс, включающий прохождение нескольких файлов конфигурации для установки паролей. Теперь это почти полностью автоматизировано.

Надеюсь, это поможет.

0 голосов
/ 13 мая 2016

Короткий ответ: он не поддерживается в классах установщика. Вам просто нужно понимать, что методы класса установщика вызываются из msiexec.exe, запущенного из системного каталога, и эта среда не может знать, что у вас есть файл настроек где-то в каталоге, о котором он совершенно не знает. Вот почему он работает с кодом, который явно идет в установленное местоположение файла и обновляет его там.

0 голосов
/ 09 февраля 2009

Ну, в конце концов, я сдался, и у меня был метод типа RunOnce, чтобы сделать это после установки приложения.

0 голосов
/ 07 февраля 2009

Честно говоря, я не знаю, поддерживается ли это во время установки, но если это так, убедитесь, что вы звоните Save() на Settings.Default.

...