4

以下代码有两个缺陷,我不知道它们是错误还是设计使然。从我所看到的应该可以使用 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 将帮助他们进行设置。我已经“以管理员身份运行”无效。

4

5 回答 5

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。

于 2009-07-08T20:18:24.523 回答
0

也许你不知道葡萄牙语或 c# 但这是你想要的http://www.linhadecodigo.com.br/Artigo.aspx?id=1613

使用来自 asp.net 的 BuildProvider

于 2009-06-26T22:28:14.520 回答
0

加载配置后,默认情况下它是只读的,主要是因为您没有覆盖 IsReadOnly 属性。尝试覆盖它。

¿ 有什么东西阻止您使用设置吗?

于 2009-07-02T18:08:44.280 回答
0

看起来这是不可能的设计。App.config 通常受到保护,因为它与应用程序一起位于 Program Files 目录中,因此安装程序必须在安装时进行修改。

真的很遗憾,我希望该应用程序具有管理员可以设置的设置。

于 2009-07-03T13:48:13.770 回答
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);
        }
于 2010-01-07T13:50:25.033 回答