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

C# WPF-在运行时修改配置设置,c#,wpf,windows-installer,connection-string,administrator,C#,Wpf,Windows Installer,Connection String,Administrator,我正在创建一个WPF应用程序。它在VisualStudio中运行良好。但是,每当我在安装后通过应用程序修改配置设置时,它都会抛出错误“加载配置文件时出错:对路径c:\Program Files(x86)\…的访问被拒绝”。我不能按照要求每次都以管理员的身份运行程序。有什么办法解决这个问题吗 var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var connectionStrin

我正在创建一个WPF应用程序。它在VisualStudio中运行良好。但是,每当我在安装后通过应用程序修改配置设置时,它都会抛出错误“加载配置文件时出错:对路径c:\Program Files(x86)\…的访问被拒绝”。我不能按照要求每次都以管理员的身份运行程序。有什么办法解决这个问题吗

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将阻止用户更改程序文件中的任何内容。这就是引起你的错误的原因

你的选择包括:

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

不要对这些变量使用配置文件,而是将它们写入appdata中的文件。如果这是多用户安装,或者您可以使用用户的appdata,则可以使用公共appdata

我建议采用后者

构建一个适合保存数据的类

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

经验法则:
将程序文件下的安装文件夹视为只读文件

这就是它的全部。大多数选项都是不好的,并列出了它们,这样人们就可以记住它们不好的原因了(我刚刚用颜色更新了链接的答案,以指示更多推荐的方法-这有点混乱,但至少可以激发想法)

选择将文件移动到可写位置,或者只使用内部默认值,或者更好的方法是从云(数据库)读取,并在需要时写入userprofile

传统的方式显然是注册香港大学的项目


(我喜欢通过数据库存储设置(而不仅仅是设置文件)实现的“设置版本控制和备份”,但需要做更多的工作)。

您需要保留更改吗?如果是,为什么不在安装过程中设置文件ACL?或者,当需要这样的更改时,正确的方法是提示以管理模式重新启动应用程序。@DipenShah我想永久地进行更改。您能帮助我在安装过程中如何设置文件访问权限吗?是否使用installshield生成安装文件?@DipenShah否,普通安装项目。@DipenShah我尝试将app.config重新分配到其他位置。我希望它能起作用。此外,如果上述修复不起作用,将尝试File.SetAccessControl。谢谢