以下代码有两个缺陷,我无法弄清楚它们是错误还是设计错误。从我所看到的应该可以使用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
我想这样做,以便在应用程序的第一次运行时检查属性,然后告诉用户如果需要设置则以管理员身份运行,其中UI将帮助他们设置。我已经“以管理员身份运行”无效。
答案 0 :(得分:1)
你的代码没有任何意义。我把你的示例代码转换成一个有效的简单示例。请注意,这不是最佳实践代码,仅仅是一个帮助您学习配置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。
答案 1 :(得分:0)
也许你不懂葡萄牙语或c#,但这是你想要的http://www.linhadecodigo.com.br/Artigo.aspx?id=1613
使用asp.net的BuildProvider
答案 2 :(得分:0)
加载配置后,默认情况下它是只读的,主要是因为您没有覆盖IsReadOnly属性。尝试覆盖它。
¿是否存在阻止您使用设置的内容?
答案 3 :(得分:0)
看起来设计不可能。 App.config通常受到保护,因为它与Program Files目录中的应用程序一起驻留,因此必须在安装时由安装程序进行修改。
可惜,我希望该应用具有管理员可以设置的设置。
答案 4 :(得分:0)
很抱歉,如果我不了解您的情况,但是,您可以在运行时更改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);
}