33

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

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

为什么是这样?

我应该如何坚持我的应用程序的全局设置?

编辑:

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

所以它在这两种情况下都有写访问权%PROGRAMFILES%

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

Settings.Default.MySetting = MyNewValue;

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

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

4

7 回答 7

81

真正完整的答案:

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

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

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

如果 MySetting 是用户设置:

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

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

于 2009-10-20T01:04:58.530 回答
4

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

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

于 2009-04-16T23:10:11.220 回答
3

简而言之:机器上没有任何位置可以更改,除非您授予这样做的权限。

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

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

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

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

  • ???

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

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

希望这可以帮助。

于 2009-04-17T02:21:25.473 回答
1

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

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

于 2009-04-16T23:12:24.803 回答
0

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

你打电话了吗

ConfigurationManager.RefreshSection("appSettings");

Configuration.Save();
于 2009-04-16T23:11:36.240 回答
0

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

于 2009-04-16T23:14:27.840 回答
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;
    }
}
于 2021-08-28T22:25:06.067 回答