WPF - 在运行时修改配置设置

WPF - Modify Configuration settings during runtime

我正在创建 WPF 应用程序。它在 Visual Studio 中运行良好。但是,每当我在安装后通过应用程序修改配置设置时,它都会抛出错误 'Error occurred loading a configuration file: Access to path c:\Program Files (x86)\… denied'。我不能每次都按要求 运行 程序作为管理员。有什么办法可以解决吗?

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");connectionStringsSection.ConnectionStrings["cn"].ConnectionString = "data source=" + txtServer.Text + ";database=" + txtDatabase.Text + ";User ID=" + txtUserID.Text + ";Password=" + pwdPassword.Password;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("connectionStrings");

config.Save(ConfigurationSaveMode.Modified);

// Force a reload of the changed section.
ConfigurationManager.RefreshSection("appSettings");

UAC 将阻止用户更改程序文件中的任何内容。这就是引发错误的原因。

https://social.technet.microsoft.com/wiki/contents/articles/30915.c-local-files.aspx

您的备选方案包括:

明确更改对配置部署到的文件夹的授权。这被广泛认为是非常糟糕的做法。忘了这是你分发给外部客户。

不要为这些变量使用配置文件,而是将它们写入 appdata 中的文件。如果这是多用户安装,您可以使用 public 应用数据,或者您可以使用用户的应用数据。

后者是我推荐的方法。

构建一个 class 适合保存您的数据。

将其序列化为字符串并另存为 xml 或 json 文件到 appdata 中。

经验法则Treat your installation folder under program files as read-only.

仅此而已。 I have this list of approaches to deal with access denied。那里的大多数选项都是不好的并列出来,因此人们可以记住它们为什么不好(我刚刚用颜色更新了链接的答案以指示更多推荐的方法 - 它有点混乱,但至少它可以激发想法)。

前往将文件移动到可写位置,或仅使用内部默认值,或更好从云(数据库) 并在需要时写入用户配置文件。

传统方式显然是带有 HKCU 条目的注册表

(我喜欢 "versioning and backup of settings" 通过数据库存储设置而不仅仅是设置文件——但更多的工作)。