为啥 app.config 中的应用程序设置是只读的?

Posted

技术标签:

【中文标题】为啥 app.config 中的应用程序设置是只读的?【英文标题】:Why are application settings read-only in app.config?为什么 app.config 中的应用程序设置是只读的? 【发布时间】:2010-10-19 23:49:52 【问题描述】:

我的 app.config 中有一些设置,我打算将其设为“全局” - 即。任何用户都可以更改它们,并且所有用户都获得相同的设置。

但除非我将它们更改为用户设置,否则它们是只读的。

这是为什么?

我应该如何保存我的应用的全局设置?

编辑:

这实际上是一个 Windows 服务应用程序,它作为 LocalSystem 服务运行。它也可以由本地管理员手动运行,带有参数“/config”,它会启动一个 Windows 表单来编辑配置值。

因此,在这两种情况下,它都具有对%PROGRAMFILES% 的写入权限。

因此,我访问设置的方式是:

Settings.Default.MySetting = MyNewValue;

当 MySetting 设置为 Application(在我的项目属性 Settings.settings 中)时,我收到一个编译时错误“MySetting 是只读的”。

我对这个东西很陌生,还没有找到一个很好的解释来解释它应该如何完成。例如,为什么我需要说“默认”,这实际上是什么意思?我不知道。如果有人可以向我指出 app.config 使用教程,那将非常有帮助。

【问题讨论】:

【参考方案1】:

真正完整的答案:

app.config 设置是只读的,因为有两种设置:

    应用程序设置 用户设置

除非应用程序发布者发布它的新版本,否则第一个不会改变。第二个不存储在 app.config 中,而是存储在 user.config 文件中。在没有这个 user.config 文件的情况下,app.config 提供了默认值。

如果 MySetting 是用户设置:

Settings.Default.MySetting = MyNewValue;
Settings.Default.Save();

它将使用新设置在[User Local Settings Application Data]\[company name]\[application].exe[hash string]\[version] 创建一个user.config 文件,这些设置将优先于app.config 文件中的设置。

【讨论】:

嗨。你能看看这个问题吗? ***.com/questions/39791332/… 有一个更干净的解决方案:social.msdn.microsoft.com/Forums/vstudio/en-US/…【参考方案2】:

原因:应用程序设置旨在存储在用户没有写入权限的 Program Files 下的 Application 文件夹中。

如何:默认不支持“所有用户”,但您应该能够在公共文件夹中设置自己的自定义配置文件或使用数据库。

【讨论】:

【参考方案3】:

简单地说:机器上的任何位置都无法更改,除非您授予这样做的权限。

有几种方法可以处理这种情况:

您可以创建一个配置文件/一些注册表设置,将其放在“所有用户”配置文件中,并授予“每个人”更改该特定文件的权限。在安装期间,您可以自动执行授予适当权限的过程,您的程序可以处理其余部分。

您可以利用 UAC 确保当前用户具有更改系统范围设置的适当权限。这是推荐的方法,但也意味着不是每个人都可以更改特定设置。

您可以使用共享数据库并将您的设置存储在其中。

???

我不建议更改程序文件目录中的项目或更改那里的默认权限。

编辑:作为本地系统,您确实拥有程序文件目录的写入权限。如果您收到“只读”错误,则表示设置本身是只读的。您需要使用配置管理器才能更改配置文件中的设置。

希望这会有所帮助。

【讨论】:

你能扩展“使用配置管理器”吗?任何有用的链接? 好的,看这里:msdn.microsoft.com/en-us/library/…【参考方案4】:

其中一个原因是 app.config 文件位于您应用的 Program Files 目录下的文件夹中,并且默认情况下,Program Files 中的所有内容对于标准用户都是只读的。

另一个是 app.config 设置适用于系统范围。如果一个用户进行更改,它将影响其他用户。普通用户不应该能够进行这种更改。任何可能影响多个用户的内容都只能由系统管理员设置。每个用户的设置属于每个用户的应用程序数据文件夹。

【讨论】:

没关系 - 我只希望系统管理员能够从我的程序中更改这些系统范围的设置。但这似乎不可能,即使我以管理员身份运行。【参考方案5】:

不太清楚你在这里的意思。 您的意思是您允许用户从 UI 更改 app.config 并且更改不会保留?

你打电话了吗

ConfigurationManager.RefreshSection("appSettings");

Configuration.Save();

【讨论】:

查看我的编辑。我使用的是 Settings.Default,而不是 ConfigurationManager - 它是否读取 app.config?【参考方案6】:

配置设置在您启动应用程序时缓存在内存中。您可以将 app.config 文件作为 xml 处理以更改值。

【讨论】:

【参考方案7】:

我正在使用此代码(静态方法)来更改默认设置:

public static bool SetGlobalSetting(string settingName, string settingValue)

    try
    
        XmlDocument xml = new XmlDocument();
        xml.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
        XmlNode xmlNode = xml.DocumentElement.SelectSingleNode("descendant::setting[@name='" + settingName + "']");
        xmlNode.SelectSingleNode("value").InnerText = settingValue;
        xml.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

        Settings s = new Settings();
        s.Reload();

        return true;
     catch (Exception e)
    
        // process the exception as you need
    
        return false;
    

【讨论】:

以上是关于为啥 app.config 中的应用程序设置是只读的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 app.config 来存储配置数据?

从 .NET 中的 app.config 或 web.config 读取设置

为啥在js取消设置只读标签后iOS不显示键盘输入?

如何编辑应用程序配置设置? App.config 最好的方法是啥?

为啥将 **appSettings** 部分添加到 App.config 会导致 WPF 应用程序出错?

为啥这个类库 dll 没有从 app.config 获取信息