невозможно сохранить настройки в app.exe.config - PullRequest
7 голосов
/ 21 июля 2009

У меня одна проблема.

я хочу сохранить настройки в файле app.config

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

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

вот класс настроек

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();
        }

и это app.config

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 21 июля 2009

В соответствии с MSDN: ConfigurationManager.GetSection Method ,

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

Однако, если вы хотите обновить файл app.config, я бы прочитал его как 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 в app.config, чтобы легко проверить результат.

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

  <MySettings CustomerName="" EmailAddress="" TimeStamp=""/>
</configuration> 
3 голосов
/ 21 июля 2009

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

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

Пример:

Допустим, вы добавили пользовательский параметр с именем CustomerName :

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

string value = Properties.Settings.Default.CustomerName;

Если вы хотите изменить значение, просто напишите ему:

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

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

Properties.Settings.Default.Save();

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

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

2 голосов
/ 24 января 2010

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

2 голосов
/ 21 июля 2009

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

Вам следует ознакомиться с серией из трех частей Джона Риста о настройке .NET 2.0 в CodeProject.

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

Марк

...