我的app.config中有一些设置,我打算成为'全球' - 即。任何用户都可以更改它们,所有用户都可以获得相同的设置。
但除非我将它们更改为用户设置,否则它们是只读的。
为什么会这样?
我应该如何坚持我的应用程序的全局设置?
修改
这实际上是一个Windows服务应用程序,它作为LocalSystem服务运行。它也可以由具有参数“/ config”的本地管理员手动运行,它启动一个窗口表单来编辑配置值。
因此在两种情况下都可以对%PROGRAMFILES%
进行写访问。
我访问我的设置的方式是:
Settings.Default.MySetting = MyNewValue;
当MySetting设置为Application时(在我的项目属性Settings.settings中),我收到编译时错误“MySetting是只读的”。
我对这些东西不熟悉,还没有找到一个很好的解释它应该如何完成。例如,为什么我需要说'默认',这究竟意味着什么?我不知道。如果有人能指出我的app.config使用教程,那将非常有帮助。
答案 0 :(得分:59)
真正完整的答案:
app.config设置是只读的,因为有两种类型的设置:
除非应用程序发布者发布新版本,否则第一个不会更改。第二个不存储在app.config中,而是存储在user.config文件中。在此user.config文件的abscence中,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
文件中的设置。
答案 1 :(得分:4)
原因:应用程序设置旨在存储在用户没有写权限的Program Files下的Application文件夹中。
如何:“所有用户”没有默认支持,但您应该能够在公共文件夹中设置自己的自定义配置文件或使用数据库。
答案 2 :(得分:3)
简单地说:除非你给予特权,否则机器上没有人可以更改的位置。
有几种方法可以解决这种情况:
您可以创建配置文件/某些注册表设置,将其置于“所有用户”配置文件中,并授予“Everyone”更改该特定文件的权限。在安装过程中,您可以自动执行授予适当权限的过程,您的程序可以处理其余的权限。
您可以利用UAC确保当前用户具有相应的权限来更改系统范围的设置。这是推荐的方法,但也意味着不是每个人都可以更改特定设置。
您可以使用共享数据库并将设置存储在那里。
???
我不建议更改程序文件目录中的项目或更改默认权限。
编辑:作为本地系统,您确实已将权限写入程序文件目录。如果出现“只读”错误,则表示设置本身是只读的。您需要使用配置管理器才能更改配置文件中的设置。
希望这有帮助。
答案 3 :(得分:1)
不太清楚你的意思。 您是说您允许用户从UI更改app.config并且更改不会保留?
你打电话了吗ConfigurationManager.RefreshSection("appSettings");
和
Configuration.Save();
答案 4 :(得分:0)
一个原因是app.config文件位于Program Files目录下的应用程序文件夹中,默认情况下,Program Files中的所有内容都只读标准用户。
另一个是app.config设置适用于系统范围。如果一个用户进行更改,则会影响其他用户。普通用户不应该做出那种改变。任何可能影响多个用户的操作都应该只设置为系统管理员。每用户设置属于每个用户的Application Data文件夹。
答案 5 :(得分:0)
启动应用程序时,配置设置将缓存在内存中。您可以将app.config文件作为xml处理以更改值。