Как изменить параметры конфигурации приложения? Приложение.config лучший способ пойти?

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

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

  • Мне интересно ... что такое лучшие и проще всего способ обработки настраиваемых параметров для проекта -- думал, что это будет быть ежу понятно С тем, как .Net справиться с этим. .. позор мне.

  • можно ли использовать один из параметры параметр appsettings, applicationsettings-это или UserSettings чтобы справиться с этим?

лучше всего писать мои настройки пользовательских config и справиться сам?

прямо сейчас ... Я ищу самое быстрое решение!

мой среда-это C#, .Net 3.5 и Visual Studio 2008.

обновление

Я пытаюсь сделать следующее:

    protected override void Save()
    {
        Properties.Settings.Default.EmailDisplayName = this.ddEmailDisplayName.Text;
        Properties.Settings.Default.Save();
    }

дает мне ошибку только для чтения при компиляции.

9 ответов


Это глупо ... и я думаю, что должен извиниться за то, что потратил время впустую! Но, похоже, мне просто нужно установите область в User вместо приложения, и я могу написать новое значение.


 System.Configuration.Configuration config =ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        config.AppSettings.Settings["oldPlace"].Value = "3";     
        config.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("appSettings");

попробуйте с этим кодом, легко.

Atte: Erick Siliezar


У меня была та же проблема, пока я не понял, что запускаю приложение в режиме отладки, поэтому мой новый ключ appSetting был записан в [applicationName].vshost.исполняемый.config.

и этот vshost.исполняемый.файл конфигурации не сохраняет никаких новых ключей после закрытия приложения - он возвращается к [applicationName].EXE-файл.config содержимое файла.

я протестировал его за пределами отладчика и различных методов здесь и в другом месте, чтобы добавить ключ настройки appSetting работает нормально. Новый ключ добавляется в: [applicationName].EXE-файл.config.


Я также попытался решить эту проблему, и теперь у меня есть хороший довольно ConsoleApplication, который я хочу поделиться: (App.config)

то, что вы увидите-это:

  1. как читать все AppSetting propery
  2. как вставить новое свойство
  3. Как удалить свойство
  4. Как обновить свойство

удачи!

    public void UpdateProperty(string key, string value)
    {
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        KeyValueConfigurationCollection appSettings = config.AppSettings.Settings;


        // update SaveBeforeExit
        config.AppSettings.Settings[key].Value = value;
        Console.Write("...Configuration updated: key "+key+", value: "+value+"...");

        //save the file
        config.Save(ConfigurationSaveMode.Modified);
        Console.Write("...saved Configuration...");
        //relaod the section you modified
        ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
        Console.Write("...Configuration Section refreshed...");
    }

    public void ReadAppSettingsProperty()
    {
        try
        {
            var section = ConfigurationManager.GetSection("applicationSettings");

            // Get the AppSettings section.
            NameValueCollection appSettings = ConfigurationManager.AppSettings;

            // Get the AppSettings section elements.
            Console.WriteLine();
            Console.WriteLine("Using AppSettings property.");
            Console.WriteLine("Application settings:");

            if (appSettings.Count == 0)
            {
            Console.WriteLine("[ReadAppSettings: {0}]", "AppSettings is empty Use GetSection command first.");
            }
            for (int i = 0; i < appSettings.Count; i++)
            {
                Console.WriteLine("#{0} Key: {1} Value: {2}",
                i, appSettings.GetKey(i), appSettings[i]);
            }
        }
        catch (ConfigurationErrorsException e)
        {
            Console.WriteLine("[ReadAppSettings: {0}]", e.ToString());
        }

    }


    public void updateAppSettingProperty(string key, string value)
    {
        // Get the application configuration file.
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        string sectionName = "appSettings";


        config.AppSettings.Settings.Remove(key);
        config.AppSettings.Settings.Add(key, value);

        SaveConfigFile(config);
    }

    public void insertAppSettingProperty(string key, string value)
    {
        // Get the application configuration file.
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        string sectionName = "appSettings";

        config.AppSettings.Settings.Add(key, value);

        SaveConfigFile(config);
    }

    public void deleteAppSettingProperty(string key)
    {
        // Get the application configuration file.
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        config.AppSettings.Settings.Remove(key);

        SaveConfigFile(config);
    }

    private static void SaveConfigFile(System.Configuration.Configuration config)
    {
        string sectionName = "appSettings";

        // Save the configuration file.
        config.Save(ConfigurationSaveMode.Modified);

        // Force a reload of the changed section. This  
        // makes the new values available for reading.
        ConfigurationManager.RefreshSection(sectionName);

        // Get the AppSettings section.
        AppSettingsSection appSettingSection =
          (AppSettingsSection)config.GetSection(sectionName);

        Console.WriteLine();
        Console.WriteLine("Using GetSection(string).");
        Console.WriteLine("AppSettings section:");
        Console.WriteLine(appSettingSection.SectionInformation.GetRawXml());
    }    
}

файл конфигурации выглядит as:

<configuration>
<configSections>
</configSections>
<appSettings>
    <add key="aNewKey1" value="aNewValue1" />
</appSettings>

Ну, поэтому у меня не было никаких проблем с AppSettings с этим решением! Повеселись... ;-) !


Не уверен, что это то, что вам нужно, но вы можете обновить и сохранить настройку из приложения:

ConsoleApplication1.Свойства.Настройки.По умолчанию.StringSetting = " тест"; ConsoleApplication1.Свойства.Настройки.По умолчанию.Save();


Как вы ссылаетесь на класс настроек в коде? Вы используете экземпляр по умолчанию или создаете новый объект Settings? Я считаю, что экземпляр по умолчанию использует созданное конструктором значение, которое перечитывается из файла конфигурации только при открытии свойств. Если вы создаете новый объект, я считаю, что значение считывается непосредственно из самого файла конфигурации, а не из атрибута, созданного дизайнером, если параметр не существует в приложении.конфиг файл.

обычно Мои настройки будут в библиотеке, а не непосредственно в приложении. Я установил допустимые значения по умолчанию в файле свойств. Затем я могу переопределить их, добавив соответствующий раздел конфигурации (извлеченный и измененный из приложения библиотеки.конфигурационный файл) в конфигурации приложения (либо web.config или app.конфигурации, по мере необходимости).

использование:

 Settings configuration = new Settings();
 string mySetting = configuration.MySetting;

вместо:

 string mySetting = Settings.Default.MySetting;

- это ключ для меня.


EDIT: моя ошибка. Я неправильно понял цель первоначального вопроса.

ОРИГИНАЛЬНЫЙ ТЕКСТ:

мы часто устанавливаем наши настройки непосредственно в приложении.файл конфигурации, но обычно это для наших пользовательских настроек.

примера приложения.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="MySection" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </configSections>
    <connectionStrings>
        <add name="Default" connectionString="server=MyServer;database=MyDatabase;uid=MyDBUser;password=MyDBPassword;connection timeout=20" providerName="System.Data.SqlClient" />
    </connectionStrings>
    <MySection>
        <add key="RootPath" value="C:\MyDirectory\MyRootFolder" /> <!-- Path to the root folder. -->
        <add key="SubDirectory" value="MySubDirectory" /> <!-- Name of the sub-directory. -->
        <add key="DoStuff" value="false" /> <!-- Specify if we should do stuff -->
    </MySection>
</configuration>

попробуйте это:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <configSections>
   <!--- ->
  </configSections>

  <userSettings>
   <Properties.Settings>
      <setting name="MainFormSize" serializeAs="String">
        <value>
1022, 732</value>
      </setting>
   <Properties.Settings>
  </userSettings>

  <appSettings>
    <add key="TrilWareMode" value="-1" />
    <add key="OptionsPortNumber" value="1107" />
  </appSettings>

</configuration>

чтение значений из приложения.Файл Конфигурации:

//This method will read the value of the OptionsPortNumber in the
//above app.config file.
private int LoadConfigData ()
    {
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        // AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
        // points to the config file.   
        doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
        int smartRefreshPortNumber = 0;
        foreach (XmlNode node in doc.ChildNodes.Item(1))
        {
        //Searching for the node “”
            if (node.LocalName == "appSettings")
            {
                 smartPortNumber =Convert.ToInt32(node.ChildNodes.Item(1).Attributes[1].Value);
            }
        }
        Return smartPortNumber;
    }

обновление значения в приложении.config:

//This method will read the value of the OptionsPortNumber in the
//above app.config file.
private void UpdateConfigData()
    {
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);


        //Looping through all nodes.
        foreach (XmlNode node in doc.ChildNodes.Item(1))
        {
        //Searching for the node “”
            if (node.LocalName == "appSettings")
            {
                if (!dynamicRefreshCheckBox.Checked)
                {
                    node.ChildNodes.Item(1).Attributes[1].Value = this.portNumberTextBox.Text;
                }
                else
                {
                    node.ChildNodes.Item(1).Attributes[1].Value = Convert.ToString(0);
                }
            }
        }
        //Saving the Updated values in App.config File.Here updating the config
        //file in the same path.
        doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    }