无法在 .NET 项目中使用 PerUserRoaming 参数保存配置文件

本文关键字:PerUserRoaming 参数 保存 配置文件 NET 项目 | 更新日期: 2023-09-27 18:35:26

我正在开发一个WPF项目。我想保存用户设置。我习惯于ConfigurationManagerClass。我阅读了这些链接(http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.appsettings.aspx,http://msdn.microsoft.com/en-us/library/ms134265(v=vs.110).aspx)。然后我决定使用PerUserRoaming参数。根据这个参数,设置应该写在"C:''Users''BDagli''AppData''Roaming''DiBASUI''DiBASUI.vshost.exe_Url_zep32lw2fomt1eij4jb2qhip2cbd211o''1.0.0.0''user.config"中。但它无法创建。并且发生异常。

系统.配置

.配置错误异常: 执行 appSettings 的配置节处理程序时出错。 ---> 系统无效操作异常: 锁定时无法编辑配置节属性。 at System.Configuration.SectionInformation.VerifyIsEditable() at System.Configuration.MgmtConfigurationRecord.GetConfigDefinitionUpdates(Boolean requireUpdates, ConfigurationSaveMode saveMode, Boolean forceSaveAll, ConfigDefinitionUpdates&definitionUpdates, ArrayList&configSourceUpdates) ---内部异常堆栈跟踪结束--- 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

我的代码如下:

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");

我该如何继续?

我添加了 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());
        }
    }

发生异常如下:

System.InvalidOperationException: {"ConfigurationSection properties cannot be edited when locked."}

无法在 .NET 项目中使用 PerUserRoaming 参数保存配置文件

使用字符串 exe 路径。只有这样才能保存配置。

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

根据这个答案:

您需要为该节设置 SectionInformation.AllowExeDefinition 值:

所以,你的代码应该是这样的:

settings.SectionInformation.AllowExeDefinition =   
             ConfigurationAllowExeDefinition.MachineToLocalUser;

您可以在此处(MSDN 论坛)或本文中找到有关配置级别的详细信息:
SYSK 73:关于 allowExeDefinition 属性的重要性。