Изменить App.config во время установки - PullRequest
6 голосов
/ 09 февраля 2012

У меня есть XML-файл с такими настройками

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="UpdateReportService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <UpdateReportService.Properties.Settings>
            <setting name="Path" serializeAs="String">
                <value>C:\1</value>
            </setting>
            <setting name="Branch" serializeAs="String">
                <value>200</value>
            </setting>
            <setting name="b204" serializeAs="String">
                <value>192.168.1.55</value>
            </setting>
            <setting name="b200" serializeAs="String">
                <value>192.168.0.83</value>
            </setting>
            <setting name="Hour" serializeAs="String">
                <value>11</value>
            </setting>
        </UpdateReportService.Properties.Settings>
    </applicationSettings>
</configuration>

И я хотел бы изменить некоторые значения на значения, введенные пользователем во время установки программы.

Я нахожу пример на VB и пытаюсь преобразовать его в c #:

namespace InstallConfigurator
{
    [RunInstaller(true)]
    public class SettingsClass : Installer
    {
        public override void Install(System.Collections.IDictionary stateSaver)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(Context.Parameters["TARGETDIR"].ToString() + "UpdateReportService.exe");

            ClientSettingsSection applicationSettingsSection = (ClientSettingsSection)config.SectionGroups["applicationSettings"].Sections["UpdateReportService.Properties.Settings"];

            SettingElement Elem = applicationSettingsSection.Settings["Branch"];

            applicationSettingsSection.Settings.Remove(Elem);


            Elem.Value.ValueXml.InnerXml = "30000";
            applicationSettingsSection.Settings.Add(Elem);

            config.Save(ConfigurationSaveMode.Full);
        }
    }
}

Но получите ошибку «недоступна из-за уровня защиты» в этом месте:

SettingElement Elem = applicationSettingsSection.Settings["Branch"];

Итак, возможно ли на c # получить доступ к разделу в App.config и изменить его.


Upd. 2012.02.10

Я решил проблему следующим образом:

namespace InstallConfigurator
{
    [RunInstaller(true)]
    public class SettingsClass : Installer
    {
        public override void Install(System.Collections.IDictionary stateSaver)
        {
            string xml = Context.Parameters["TARGETDIR"].ToString() + "UpdateReportService.exe.config";

            XmlDocument document = new XmlDocument();
            document.Load(xml);
            XPathNavigator navigator = document.CreateNavigator();
            XmlNamespaceManager ns = new XmlNamespaceManager(navigator.NameTable);

            foreach (XPathNavigator nav in navigator.Select(@"/configuration/applicationSettings/UpdateReportService.Properties.Settings/setting[@name='Branch']/value"))
            {
                nav.SetValue(Context.Parameters["BRANCH"].ToString());
            }

            foreach (XPathNavigator nav in navigator.Select(@"/configuration/applicationSettings/UpdateReportService.Properties.Settings/setting[@name='Path']/value"))
            {
                nav.SetValue(Context.Parameters["PATH"].ToString());
            }

            document.Save(xml);
        }
    }
}

1 Ответ

2 голосов
/ 09 февраля 2012

В аналогичном проекте я делаю это немного по-другому:

  1. Отправьте вашу установку с нет файлом "myapp.exe.config".
  2. Вместо этого отправьте файл «myapp.exe.config.default», который содержит заполнители, например «{Branch}».
  3. Во время установки загрузите «myapp.exe.config.default» какстрока в память.
  4. Замените заполнители фактическими значениями (например, вашим "30000").
  5. Запишите замененную строку как фактический файл "myapp.exe.config".
  6. Бонус: перед написанием конфигурации проверьте, присутствует ли какой-либо существующий файл конфигурации, и скопируйте его как резервную копию, чтобы сохранить предыдущую версию.

В наших приложениях это работает довольно гладко.

...