7

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

  1. Bootstrapperは構成ファイルを作成します。
  2. Bootstrapperは、新しい構成ファイルを構成ファイルとして使用して、新しいAppDomainを初期化します。
  3. その結果、新しいAppDomainは新しい構成ファイルを使用するように構成され、すべて正常に機能します。

この複数のAppDomainアプローチから離れたいと思います。特にアンマネージライブラリやその他のレガシーコードに関しては、複雑さが増します。

1つのAppDomainに移動すると、ワークフローは次のように変更されます。

  1. Bootstrapperは構成ファイルを作成します。
  2. Bootstrapperは、構成ファイルを独自の構成ファイルにマージします。
  3. Bootstrapperは、ConfigurationManagerキャッシュを更新します。
  4. Bootstrapperは、同じAppDomainでメインアプリを起動します。

ConfigurationManagerはセクションをメモリにキャッシュしているようです。したがって、たとえば、手順3の前にAppSettingsを読んだ場合は、次のように呼び出す必要があります。ConfigurationManager.RefreshSection("appSettings");実際、ブートストラッパーによって使用されたセクションが更新されていることを確認する必要があります。

新しい構成ファイルのすべての構成セクションを繰り返し処理して強制的に更新することはできますが、これにより、構成マネージャーは構成ファイルで参照されているすべてのアセンブリを強制的にロードします。可能であればこれを延期したいと思います。ConfigurationManagerが現在メモリに持っているものを無効にする方法はありますか?

4

1 に答える 1

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 クラスの実装を変更することを決定した場合、いつでも壊れる可能性があります。

于 2014-01-03T15:22:06.560 に答える