无法在app.exe.config中保存设置

时间:2009-07-21 05:00:14

标签: c# configuration app-config

我正面临一个问题。

我想在app.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();
        }

这是app.config

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

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

你可以告诉我错误在哪里..我尝试了很多并从互联网上阅读。但仍然无法在配置文件中保存信息..

我也通过双击exe文件来运行应用程序。

4 个答案:

答案 0 :(得分:5)

根据MSDN: ConfigurationManager.GetSection Method

ConfigurationManager.GetSection方法访问运行时配置信息 无法更改 。要更改配置,请使用以下Open方法之一在配置文件上使用Configuration.GetSection方法:

但是,如果要更新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";
        }
    }
}

我还在app.config中为MySettings添加了“TimeStamp”属性,以便轻松检查结果。

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

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

答案 1 :(得分:3)

在许多情况下(在受限用户场景中),用户没有直接对应用程序配置文件的写访问权限。要解决这个问题,您需要使用usersettings。

如果右键单击项目并选择名为“设置”的选项卡,则可以列出与配置文件一起存储的设置。如果选择“范围”为“用户”,则设置将自动存储在配置文件中,该类型将自动将设置存储在用户AppData区域下,用户始终具有写访问权限。这些设置也会自动作为在Properties \ Settings.Designer.cs代码文件中创建的属性提供,并可在Properties.Settings.Default的代码中访问。

实施例

假设您添加了名为客户名称的用户设置:

在加载应用程序时,您需要从存储的设置中检索该值(默认值,因为它在应用程序配置中,或者如果它是为该用户存储的,则为用户的配置文件):

string value = Properties.Settings.Default.CustomerName;

如果要更改值,只需写入:

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

如果要保存所有设置,只需调用保存:

Properties.Settings.Default.Save();

请注意,在开发时,用户文件将重置为默认值,但这仅在构建应用程序时才会发生。当您运行该应用程序时,您存储的设置将从应用程序的用户配置文件中读取。

如果您仍想创建自己的设置处理,可以尝试一次,并查看VisualStudio自动为您创建的内容,以了解实现此功能所需的内容。

答案 2 :(得分:2)

为了实际更新配置文件,您需要在.Save()对象上调用Configuration - 而不仅仅是您的配置部分对象。

你应该在CodeProject上查看Jon Rista关于.NET 2.0配置的三部分系列文章。

强烈推荐,写得很好,非常有帮助!它显示了处理.NET 2.0和up配置的所有细节,并帮助我非常了解这个主题。

马克

答案 3 :(得分:2)

请注意,appname.vshost.exe.Config将恢复为调试会话结束时的原始状态。因此,您可能正在保存到文件中(可以在执行期间使用记事本进行检查),然后在调试停止时丢失保存的内容。