4

次のコードには 2 つの欠陥があります。バグなのか設計によるものなのか、私にはわかりません。私が見たところ、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 を使用して、数千行のカスタム階層構成を持つ大規模なエンタープライズ アプリの構成セクションを作成しました (ただし、構成は読み取り専用でした)。構成 API は、習得すると非常に強力になります。その機能について詳しく知る方法の 1 つは、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

あなたのケースを理解できなかった場合は申し訳ありませんが、はい、実行時に 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 に答える
0

構成をロードした後、主に IsReadOnly プロパティをオーバーライドしていないため、構成はデフォルトで読み取り専用になります。オーバーライドしてみてください。

設定の使用を妨げるものはありますか?

于 2009-07-02T18:08:44.280 に答える
0

設計上、できないようです。App.config は通常、アプリと共に Program Files ディレクトリにあるため保護されているため、インストール時にインストーラーによって修正する必要があります。

本当に残念です。アプリに管理者が設定できる設定が必要です。

于 2009-07-03T13:48:13.770 に答える