如何使用强类型对象写入我自己的 app.config?
Posted
技术标签:
【中文标题】如何使用强类型对象写入我自己的 app.config?【英文标题】:How can I write to my own app.config using a strongly typed object? 【发布时间】:2010-11-05 21:07:21 【问题描述】:以下代码有两个缺陷,我不知道它们是错误还是设计。据我所见,应该可以使用 Configuration.Save 写回 app.config 文件,并且根据http://www.codeproject.com/KB/cs/SystemConfiguration.aspx 代码应该可以工作。
错误显示在下面的源代码中,并在您尝试设置属性或保存配置时出现。
Imports System.Configuration
Public Class ConfigTest
Inherits ConfigurationSection
<ConfigurationProperty("JunkProperty", IsRequired:=True)> _
Public Property JunkProperty() As String
Get
Return CStr(Me("JunkProperty"))
End Get
Set(ByVal value As String)
' *** Bug 1, exception ConfigurationErrorsException with message "The configuration is read only." thrown on the following line.
Me("JunkProperty") = value
End Set
End Property
Public Sub Save()
Dim ConfigManager As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
' The add / remove is according to http://www.codeproject.com/KB/cs/SystemConfiguration.aspx
ConfigManager.Sections.Remove("ConfigTest")
' *** Bug 2, exception InvalidOperationException thrown with message "Cannot add a ConfigurationSection that already belongs to the Configuration."
ConfigManager.Sections.Add("ConfigTest", Me)
ConfigManager.Save(ConfigurationSaveMode.Full, True)
End Sub
Public Shared Sub Main()
Dim AppConfig As ConfigTest = TryCast(ConfigurationManager.GetSection("ConfigTest"), ConfigTest)
AppConfig.JunkProperty = "Some test data"
AppConfig.Save()
End Sub
' App.Config should be:
' <?xml version="1.0" encoding="utf-8" ?>
'<configuration>
' <configSections>
' <section name="ConfigTest" type="ConsoleApp.ConfigTest, ConsoleApp" />
' </configSections>
' <ConfigTest JunkProperty="" />
'</configuration>
End Class
我想这样做,以便在第一次运行应用程序时检查属性,然后告诉用户是否需要设置以管理员身份运行,用户界面将帮助他们设置。我已经“以管理员身份运行”无效。
【问题讨论】:
【参考方案1】:对不起,如果我不理解您的情况,但是可以,您可以在运行时更改 App.config。
实际上,您需要更改 YourApp.exe.config,因为一旦您的应用程序编译完成,App.config 的内容就会复制到 YourApp.exe.config 中,并且您的应用程序永远不会回头查看 App.config。
这就是我所做的(C# 代码 - 抱歉,我还没有学习 VB.Net)
public void UpdateAppSettings(string key, string value)
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
foreach (XmlElement item in xmlDoc.DocumentElement)
foreach (XmlNode node in item.ChildNodes)
if (node.Name == key)
node.Attributes[0].Value = value;
break;
using (StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile))
xmlDoc.Save(sw);
【讨论】:
【参考方案2】:您的代码实际上没有任何意义。我把你的示例代码变成了一个简单的例子。请注意,这不是最佳实践代码,只是帮助您学习配置 API 的示例。
Public Class ConfigTest
Inherits ConfigurationSection
<ConfigurationProperty("JunkProperty", IsRequired:=True)> _
Public Property JunkProperty() As String
Get
Return CStr(Me("JunkProperty"))
End Get
Set(ByVal value As String)
' *** Bug 1, exception ConfigurationErrorsException with message "The configuration is read only." thrown on the following line.
Me("JunkProperty") = value
End Set
End Property
Public Overrides Function IsReadOnly() As Boolean
Return False
End Function
Public Shared Sub Main()
Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
Dim AppConfig As ConfigTest = config.GetSection("ConfigTest")
AppConfig.JunkProperty = "Some test data"
config.Save()
End Sub
End Class
此代码将打开配置文件,修改属性 JunkProperty 并将其持久化回可执行文件的配置文件。希望这可以帮助您入门 - 看起来您需要更多地了解配置 API。
我已使用 API 为大型企业应用程序创建配置部分,其中包含 1000 行自定义分层配置(尽管我的配置是只读的)。一旦你学会了配置 API,它就非常强大。我发现更多关于其功能的一种方法是使用 Reflector 来了解 .NET 框架如何在内部使用 API。
【讨论】:
谢谢,这行得通。我快到了,但被那篇该死的 CodeProject 文章弄糊涂了,该文章坚持我必须添加和删除配置部分才能重新保存。 其实不行。新的属性值不会保存到配置文件中。【参考方案3】:看起来这在设计上是不可能的。 App.config 通常受保护,因为它与应用程序一起位于 Program Files 目录中,因此安装程序必须在安装时进行修改。
真的很遗憾,我希望该应用具有管理员可以设置的设置。
【讨论】:
【参考方案4】:加载配置后,默认情况下它是只读的,主要是因为您没有覆盖 IsReadOnly 属性。尝试覆盖它。
¿是否存在阻止您使用设置的原因?
【讨论】:
不,覆盖 IsReadOnly 属性没有任何效果。【参考方案5】:也许你不懂葡萄牙语或 c# 但这是你想要的 http://www.linhadecodigo.com.br/Artigo.aspx?id=1613
使用来自 asp.net 的 BuildProvider
【讨论】:
我翻译了那篇文章 (translate.google.co.uk/…),但看不到它提到读/写 app.config 文件的位置。以上是关于如何使用强类型对象写入我自己的 app.config?的主要内容,如果未能解决你的问题,请参考以下文章