1

I am developing a WPF project. I want to save users settings. I use to ConfigurationManagerClass. I read these links(http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.appsettings.aspx , http://msdn.microsoft.com/en-us/library/ms134265(v=vs.110).aspx). Then I decided to use PerUserRoaming param. According to this param , settings should be written in "C:\Users\BDagli\AppData\Roaming\DiBASUI\DiBASUI.vshost.exe_Url_zep32lw2fomt1eij4jb2qhip2cbd211o\1.0.0.0\user.config" . But it can not be created. And exception is occured.

System.Configuration.ConfigurationErrorsException: An error occurred executing the configuration section handler for appSettings. ---> System.InvalidOperationException: ConfigurationSection properties cannot be edited when locked. at System.Configuration.SectionInformation.VerifyIsEditable() at System.Configuration.MgmtConfigurationRecord.GetConfigDefinitionUpdates(Boolean requireUpdates, ConfigurationSaveMode saveMode, Boolean forceSaveAll, ConfigDefinitionUpdates& definitionUpdates, ArrayList& configSourceUpdates) --- End of inner exception stack trace --- at System.Configuration.MgmtConfigurationRecord.GetConfigDefinitionUpdates(Boolean requireUpdates, ConfigurationSaveMode saveMode, Boolean forceSaveAll, ConfigDefinitionUpdates& definitionUpdates, ArrayList& configSourceUpdates) at System.Configuration.MgmtConfigurationRecord.SaveAs(String filename, ConfigurationSaveMode saveMode, Boolean forceUpdateAll) at System.Configuration.Configuration.SaveAsImpl(String filename, ConfigurationSaveMode saveMode, Boolean forceSaveAll) at System.Configuration.Configuration.Save(ConfigurationSaveMode saveMode) at DiBASUI.ConfigurationHelper.AddUpdateAppSettings(String key, String value) in c:\Users\BDagli\Documents\Visual Studio 2013\Projects\WpfApplication2\DiBASUI\ConfigurationHelper.cs:line 66

My code is as follows:

public static void AddUpdateAppSettings(string key, string value) 
    {
        try
        {
            var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
            var settings = configFile.AppSettings.Settings;
            if (settings[key] == null)
            {
                settings.Add(key, value);
            }
            else
            {
                settings[key].Value = value;
            }
            configFile.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
        }
        catch (ConfigurationErrorsException ex)
        {
            Console.WriteLine(ex.ToString());
        }

    }

*******************************

ConfigurationHelper.AddUpdateAppSettings("rememberMe", "true");

How Can I proceed?

I added AllowExeDefinition.

 public static void AddUpdateAppSettings(string key, string value) 
    {
        try
        {
            Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
            AppSettingsSection appSettings = configFile.AppSettings;
   error line-> appSettings.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToRoamingUser;
            var settings = appSettings.Settings;
            if (settings[key] == null)
            {
                settings.Add(key, value);
            }
            else
            {
                settings[key].Value = value;
            }
            configFile.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
        }
        catch (ConfigurationErrorsException ex)
        {
            Console.WriteLine(ex.ToString());
        }

    }

Exception is occured which is as follow:

System.InvalidOperationException: {"ConfigurationSection properties cannot be edited when locked."}
Burak Dağlı
  • 512
  • 2
  • 10
  • 33

2 Answers2

2

Use string exe path. Only this way is possible to save configuration.

   private void UpdateConfigSection(string sectionName, string value)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);
            config.AppSettings.Settings[sectionName].Value = value;
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
        }
Mr.B
  • 3,484
  • 2
  • 26
  • 40
1

According this answer:

You need to set the SectionInformation.AllowExeDefinition value for the section:

So, you code should be like this:

settings.SectionInformation.AllowExeDefinition =   
             ConfigurationAllowExeDefinition.MachineToLocalUser;

You can find more information about the configuration levels here (MSDN forums) or in this article:
SYSK 73: On the Importance of allowExeDefinition Attribute.

Community
  • 1
  • 1
VMAtm
  • 27,943
  • 17
  • 79
  • 125