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

35
我在app.config中有一些设置,我希望它们是“全局”的——也就是说,任何用户都可以更改它们,并且所有用户都获得相同的设置。但是,除非我将它们更改为用户设置,否则它们是只读的。这是为什么?我应该如何保存我的应用程序的全局设置?
编辑:实际上,这是一个作为LocalSystem服务运行的Windows服务应用程序。它还可以由本地管理员手动运行,并使用参数“/config”启动一个窗体来编辑配置值。因此,在两种情况下,它都可以访问%PROGRAMFILES%以进行写入操作。我访问我的设置的方式如下:
Settings.Default.MySetting = MyNewValue;

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

我对这个东西很新,还没有找到一个非常好的解释来说明它应该如何完成。例如,为什么我需要说“Default”,那实际上意味着什么?我毫无头绪。如果有人能指点我一下如何使用 app.config 的教程,那就太好了。

7个回答

84

真正的完整答案:

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

  1. 应用程序设置
  2. 用户设置

第一种类型除非应用程序发布新版本,否则不会更改。而第二种类型不存储在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 文件中的设置。


你好。请问你能看一下这个问题吗?http://stackoverflow.com/questions/39791332/application-creates-folder-with-in-place-for-space-in-name-when-using-proper - Pritam
有一个更加干净的解决方案:https://social.msdn.microsoft.com/Forums/vstudio/en-US/8d242c60-8603-4ccf-89ec-0d4740032e7a/programmatically-change-appconfig?forum=clr - OverMars

4

为什么: 应用程序设置应存储在Program Files下的Application文件夹中,用户没有写权限。

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


3
简单来说:除非您授予权限,否则没有人可以更改计算机上的所有位置。
处理这种情况有几种方法:
1. 您可以创建配置文件/某些注册表设置,将其放在“所有用户”配置文件中,并授予“每个人”更改该特定文件的权限。在安装期间,您可以自动化授予适当的权限,并让您的程序处理其余部分。 2. 您可以利用UAC确保当前用户具有更改系统范围设置所需的权限。这是推荐的方法,但也意味着并非每个人都可以更改特定设置。 3. 您可以使用共享数据库并将设置存储在其中。 4. ???
我不建议更改程序文件目录中的项目或更改那里的默认权限。
编辑:作为本地系统,您确实具有对程序文件目录的写入权限。如果出现“只读”错误,则表示设置本身是只读的。您需要使用配置管理器才能更改配置文件中的设置。
希望这可以帮助你。

你能详细说明一下“使用配置管理器”的方法吗?有什么有用的链接吗? - Blorgbeard
1
当然,请看这里:http://msdn.microsoft.com/zh-cn/library/system.configuration.configuration.aspx - Jeroen Landheer

1

一个原因是app.config文件位于程序文件目录下的应用程序文件夹中,而默认情况下,标准用户无法读取Program Files中的所有内容。

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


没关系 - 我只想让系统管理员能够从我的程序内部更改这些系统级设置。但似乎不可能,即使我以管理员身份运行。 - Blorgbeard

0
我正在使用这段代码(一个静态方法)来更改默认设置:
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;
    }
}

0

不太确定你在这里的意思。 你是指允许用户从UI更改app.config,但更改未被持久化吗?

你调用了吗?

ConfigurationManager.RefreshSection("appSettings");

并且

Configuration.Save();

1
看我的编辑,我正在使用Settings.Default,而不是ConfigurationManager - 它会读取app.config吗? - Blorgbeard

0

当您启动应用程序时,配置设置会在内存中缓存。您可以将app.config文件视为xml来更改这些值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接