无法在 .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."}
使用字符串 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 属性的重要性。