невозможно сохранить настройки в приложении.исполняемый.конфиг

я столкнулся с одной проблемой.

Я хочу сохранить настройки в приложение.файл config

Я написал отдельный класс и определенный раздел в файле конфигурации..

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

вот SettingsClass

public class MySetting:ConfigurationSection
    {
        private static MySetting settings = ConfigurationManager.GetSection("MySetting") as MySetting;

        public override bool IsReadOnly()
        {
            return false;
        }

        public static MySetting Settings
        {
            get
            {
                return settings;
            }
        }


        [ConfigurationProperty("CustomerName")]
        public String CustomerName
        {
            get
            {
                return settings["CustomerName"].ToString();
            }
            set
            {
                settings["CustomerName"] = value;
            }
        }


        [ConfigurationProperty("EmailAddress")]
        public String EmailAddress
        {
            get
            {                
                return settings["EmailAddress"].ToString();
            }
            set
            {
                settings["EmailAddress"] = value;
            }
        }


        public static bool Save()
        {
            try
            {
                System.Configuration.Configuration configFile = Utility.GetConfigFile();
                MySetting mySetting = (MySetting )configFile.Sections["MySetting "];

                if (null != mySetting )
                {
                    mySetting .CustomerName = settings["CustomerName"] as string;
                    mySetting .EmailAddress = settings["EmailAddress"] as string;                    

                    configFile.Save(ConfigurationSaveMode.Full);
                    return true;
                }

                return false;
            }
            catch
            {
                return false;
            }
        }
    }

и это код, из которого я сохраняю информацию в файле конфигурации

private void SaveCustomerInfoToConfig(String name, String emailAddress)
        {            

            MySetting .Settings.CustomerName = name;
            MySetting .Settings.EmailAddress = emailAddress
            MySetting .Save();
        }

и это приложение.config

<configuration>
  <configSections>
    <section name="MySettings" type="TestApp.MySettings, TestApp"/>
  </configSections> 

  <MySettings CustomerName="" EmailAddress="" />  
</configuration>

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

я запустил приложение, дважды щелкнув по exe-файлу.

4 ответов


по словам MSDN: ConfigurationManager.Метод GetSection,

на ConfigurationManager.GetSection метод получает параметры конфигурации что он не может изменить. Чтобы изменить конфигурацию, используйте Configuration.GetSection метод в файле конфигурации, который вы получаете с помощью одного из следующих открытых методы:

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

см. следующий пример: Примечание: этот образец как раз для доказательство концепции. Не следует использовать в производстве как есть.

using System;
using System.Linq;
using System.Xml.Linq;

namespace ChangeAppConfig
{
    class Program
    {
        static void Main(string[] args)
        {
            MyConfigSetting.CustomerName = "MyCustomer";
            MyConfigSetting.EmailAddress = "MyCustomer@Company.com";
            MyConfigSetting.TimeStamp = DateTime.Now;
            MyConfigSetting.Save();
        }
    }

    //Note: This is a proof-of-concept sample and 
    //should not be used in production as it is.  
    // For example, this is not thread-safe. 
    public class MyConfigSetting
    {
        private static string _CustomerName;
        public static string CustomerName
        {
            get { return _CustomerName; }
            set
            {
                _CustomerName = value;
            }
        }

        private static string _EmailAddress;
        public static string EmailAddress
        {
            get { return _EmailAddress; }
            set
            {
                _EmailAddress = value;
            }
        }

        private static DateTime _TimeStamp;
        public static DateTime TimeStamp
        {
            get { return _TimeStamp; }
            set
            {
                _TimeStamp = value;
            }
        }

        public static void Save()
        {
            XElement myAppConfigFile = XElement.Load(Utility.GetConfigFileName());
            var mySetting = (from p in myAppConfigFile.Elements("MySettings")
                            select p).FirstOrDefault();
            mySetting.Attribute("CustomerName").Value = CustomerName;
            mySetting.Attribute("EmailAddress").Value = EmailAddress;
            mySetting.Attribute("TimeStamp").Value = TimeStamp.ToString();

            myAppConfigFile.Save(Utility.GetConfigFileName());

        }
    }

    class Utility
    {        
        //Note: This is a proof-of-concept and very naive code. 
        //Shouldn't be used in production as it is. 
        //For example, no null reference checking, no file existence checking and etc. 
        public static string GetConfigFileName()
        {            
            const string STR_Vshostexe = ".vshost.exe";
            string appName = Environment.GetCommandLineArgs()[0];

            //In case this is running under debugger. 
            if (appName.EndsWith(STR_Vshostexe))
            {
                appName = appName.Remove(appName.LastIndexOf(STR_Vshostexe), STR_Vshostexe.Length) + ".exe";
            }

            return appName + ".config";
        }
    }
}

Я также добавил атрибут "TimeStamp" в MySettings в приложении.config легко проверить результат.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="MySettings" type="TestApp.MySettings, TestApp"/>
  </configSections>

  <MySettings CustomerName="" EmailAddress="" TimeStamp=""/>
</configuration> 

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

если щелкнуть правой кнопкой мыши проект и выбрать вкладку "Настройки", можно составить список настроек, которые хранятся в конфигурационном файле. Если выбрать "область" как "пользователь", параметры будут автоматически сохранены в файле конфигурации с использованием типа, который будет автоматически хранить параметры в области users AppData, где пользователь всегда имеет доступ на запись. Параметры также автоматически предоставляются в качестве свойств, созданных в Properties\Settings.Дизайнер.cs код файла, и доступны в вашем коде в Properties.Settings.Default .

пример:

предположим, вы добавляете параметр пользователя CustomerName:

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

string value = Properties.Settings.Default.CustomerName;

когда вы хотите изменить значение, просто напишите это:

Properties.Settings.Default.CustomerName = "John Doe";

если вы хотите сохранить все настройки, просто вызовите Save:

Properties.Settings.Default.Save();

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

если вы все еще хотите создать свою собственную обработку настроек, вы можете попробовать это один раз и посмотреть, что VisualStudio автоматически создал для вас, чтобы получить представление о том, что вам нужно, чтобы это работало.


чтобы фактически обновить файл конфигурации, вам нужно будет вызвать .Save() на Configuration object-не только объект раздела конфигурации.

вы должны проверить трехкомпонентную серию Джона Риста в конфигурации .NET 2.0 на CodeProject.

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

Марк


имейте в виду, что имя приложения.vshost.исполняемый.Config возвращается в исходное состояние в конце сеанса отладки. Таким образом, вы можете сохранить файл (вы можете проверить с помощью блокнота во время выполнения), а затем потерять сохраненное содержимое при остановке отладки.