1

私はこの Stackoverflow トピックをフォローしてきました。すべてが読み取り側で機能します。セクションの内容の辞書に変換するコレクションを取得します。これを他のプロジェクトに公開します。変更したセクション エントリを保存しようとすると、問題が発生します。外部プロジェクトの 1 つがキーと値のペアを送信し、セクションに保存する必要があります。ここに私のApp.Configがあります

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
        <configSections>
           <section name="fileEnvironmentSection" type="MyApp.Infrastructure.Configuration.FileEnvironmentSection, MyApp.Infrastructure"/>
        </configSections>

        <fileEnvironmentSection>
           <fileEnvironment>
             <add key="TestEntry1" value="A nice value"/> 
             <add key="TestEntry2" value="Another value"/> 
            </fileEnvironment>
        </fileEnvironmentSection>
     </configuration>

config セクションとやり取りするために必要なタイプの 3 つのレイヤーを次に示します。

     using System.Configuration;

     namespace SlamDunk.Infrastructure.Configuration {
        public class FileEnvironmentSection : ConfigurationSection {

           [ConfigurationProperty("fileEnvironment", IsDefaultCollection = false)]
           [ConfigurationCollection(typeof(FileEnvironmentCollection), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")]
           public FileEnvironmentCollection FileEnvironmentList {
              get { return (FileEnvironmentCollection)base["fileEnvironment"]; }
           }
        }
     }


     using System.Configuration;

     namespace SlamDunk.Infrastructure.Configuration {
        public class FileEnvironmentCollection : ConfigurationElementCollection {

           public FileEnvironmentElement this[int index] {
              get { return (FileEnvironmentElement)BaseGet(index); }
              set {
                 if(BaseGet(index) != null) BaseRemoveAt(index);
                 BaseAdd(index, value);
              }
           }

           public void Add(FileEnvironmentElement fileEnvironmentElement) { BaseAdd(fileEnvironmentElement); }

           public void Clear() { BaseClear(); }

           protected override ConfigurationElement CreateNewElement() { return new FileEnvironmentElement(); }

           protected override object GetElementKey(ConfigurationElement element) { return ((FileEnvironmentElement)element).Key; }

           public void Remove(FileEnvironmentElement fileEnvironmentElement) { BaseRemove(fileEnvironmentElement.Key); }

           public void Remove(string key) { BaseRemove(key); }

           public void RemoveAt(int index) { BaseRemoveAt(index); }
        }
     }


     using System.Configuration;

     namespace SlamDunk.Infrastructure.Configuration {
        public class FileEnvironmentElement : ConfigurationElement {

           private const string appConfigDefaultString = "missing";
           private const string _appConfigNameKey = "key";
           private const string _appConfigNameValue = "value";

           public FileEnvironmentElement() { }

           public FileEnvironmentElement(string key, string value) {
              Key = key;
              Value = value;
           }

           [ConfigurationProperty(_appConfigNameKey, DefaultValue = appConfigDefaultString, IsRequired = true, IsKey = true)]
           public string Key {
              get { return (string)this[_appConfigNameKey]; }
              set { this[_appConfigNameKey] = value; }
          }

           [ConfigurationProperty(_appConfigNameValue, DefaultValue = appConfigDefaultString, IsRequired = true, IsKey = false)]
          public string Value {
             get { return (string)this[_appConfigNameValue]; }
             set { this[_appConfigNameValue] = value; }
          }
        }
     }

キー/値の変更を保存するために使用しているコードは次のとおりです。

     var appConfiguration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
     var fileEnvironmentSection = appConfiguration.GetSection("fileEnvironmentSection") as FileEnvironmentSection;
     var fileEnvironmentList = fileEnvironmentSection.FileEnvironmentList;
     fileEnvironmentList.Remove(key);
     var element = new FileEnvironmentElement(key, value);
     fileEnvironmentList.Add(element);

     //appConfiguration.Save(ConfigurationSaveMode.Modified);

     //fileEnvironmentSection.CurrentConfiguration.Save(ConfigurationSaveMode.Modified);

     fileEnvironmentList.CurrentConfiguration.Save(ConfigurationSaveMode.Modified);

確認したところ、期待どおりに変更がリストに表示されます。コメント付きの2つの保存呼び出しと最後の呼び出しを試しました。ConfigurationManager のキャッシュの問題を回避するために、FileEnvironmentSection の新しいインスタンスを取得していると思います。各テストの実行後、MyApp.exe.config を調べましたが、変更が見つかりません。私は何かが足りないので、何かを理解するのに役立つかもしれません。ありがとう。

4

1 に答える 1

3
appConfiguration.Save(ConfigurationSaveMode.Modified, true);

appConfiguration.Save(ConfigurationSaveMode.Full, true);

後者は設定ファイルの完全な保存を強制するはずですが、前者も同様だと思います。収集した同じキーを再度追加していることに気付きました。おそらくそれが変更されたものとして取得されない理由ですか?

于 2012-01-21T22:01:16.830 に答える