7

私は、app.configファイルが複数の場所に分散されたさまざまなconfigフラグメントから動的に構築される構成システムを作成しています。システムは現在、次のように動作します。ConfigurationManagerにすべてのセクションをリロードさせる

  1. ブートストラップはコンフィギュレーションファイルを作成します。
  2. Bootstrapperは、新しい設定ファイルを設定ファイルとして新しいAppDomainを初期化します。
  3. その結果、新しいAppDomainは新しい設定ファイルを使用するように設定され、すべて正常に動作します。
私たちは、この複数のAppDomainのアプローチから脱却したいと思います

。複雑なレイヤーを追加します。特に、アンマネージライブラリやその他のレガシーコードについては、複雑なレイヤーが追加されています。

1つのAppDomainに移動するには、ワークフローがに変更しますが:

  1. ブートストラップは、設定ファイルを作成します。
  2. Bootstrapperは、設定ファイルを独自の設定ファイルにマージします。
  3. BootstrapperはConfigurationManagerのキャッシュをリフレッシュします。
  4. Bootstrapperは、同じAppDomainでメインアプリケーションを起動します。

のConfigurationManagerがメモリ内のセクションをキャッシュしているようです。たとえば、ステップ3の前にAppSettingsを読んだら、私は電話する必要があります:ConfigurationManager.RefreshSection("appSettings");実際、ブートストラップで使用されているセクションがリフレッシュされていることを確認する必要があります。

私は、これは設定ファイルで参照されるアセンブリをロードするために、構成マネージャーを強制的に、それらを更新し、新しい設定ファイルと力のconfigセクションのすべてを反復処理することですが、。私はこれを可能な限り延期したいと思います。 ConfigurationManagerが現在メモリ内に持っているものを無効にする方法があれば?

答えて

0

私は質問が長い時間前に投稿されたことを知っていますが、私はこの答えがまだ役立つことを願っています。

これを行う標準的な方法はないようです。しかし、ConfigurationManagerクラスの内部フィールドとタイプにアクセスすることで、ロードされたすべてのセクションをリストすることができました。これは私のやり方です:

private static IEnumerable<string> GetLoadedSections() 
{ 
    // s_configSystem can be null if the ConfigurationManager is not properly loaded. Accessing the AppSettings *should* do the trick. 
    var appSettings = ConfigurationManager.AppSettings; 

    FieldInfo s_configSystemField = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static); 
    object s_configSystem = s_configSystemField.GetValue(null); 
    FieldInfo _completeConfigRecordField = s_configSystem.GetType().GetField("_completeConfigRecord", BindingFlags.NonPublic | BindingFlags.Instance); 
    object _completeConfigRecord = _completeConfigRecordField.GetValue(s_configSystem); 
    FieldInfo _sectionRecordsField = _completeConfigRecord.GetType().GetField("_sectionRecords", BindingFlags.NonPublic | BindingFlags.Instance); 
    Hashtable _sectionRecords = (Hashtable)_sectionRecordsField.GetValue(_completeConfigRecord); 
    return _sectionRecords.Keys.OfType<string>(); 
} 

"system.diagnostics"セクションは常にロードされているようです。 「appSettings」セクションは、一貫して動作するようにアクセスする必要があるため、読み込まれます。

これは私のマシン(.NET 4.5)で動作しますが、内部のものに依存しているため、MicrosoftがConfigurationManagerクラスの実装を変更するといつでも破損する可能性があります。

関連する問題