Ändern Sie die Standard-app.config während der Laufzeit dynamisch
Problembeschreibung:
Entwickeln Sie eine Lösung, die Konfigurationsabschnitte aus dynamisch geladenen Anwendungsmodulen dynamisch in eine neue In-Memory-App.config lädt und so sicherstellt, dass die Anwendung die geänderte Konfiguration transparent verwendet, ohne die Standard-App zu überschreiben.
Lösung:
Zugehörige Fragen schlagen vor, die Methode SetData
zu verwenden, um den Konfigurationssystempfad zu ändern. Dies ist jedoch nur wirksam, wenn sie ausgeführt wird, bevor das Konfigurationssystem zum ersten Mal verwendet wird. Um dieses Problem vollständig zu beheben, müssen auch die zwischengespeicherten Konfigurationswerte gelöscht werden.
Umsetzung:
Der folgende Code zeigt, wie das gewünschte Verhalten erreicht wird:
<code class="language-csharp">using System; using System.Configuration; using System.Linq; using System.Reflection; public abstract class AppConfig : IDisposable { public static AppConfig Change(string path) { return new ChangeAppConfig(path); } public abstract void Dispose(); private class ChangeAppConfig : AppConfig { private readonly string oldConfig = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString(); private bool disposedValue; public ChangeAppConfig(string path) { AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path); ResetConfigMechanism(); } public override void Dispose() { if (!disposedValue) { AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig); ResetConfigMechanism(); disposedValue = true; } GC.SuppressFinalize(this); } private static void ResetConfigMechanism() { typeof(ConfigurationManager) .GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, 0); typeof(ConfigurationManager) .GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, null); typeof(ConfigurationManager) .Assembly.GetTypes() .Where(x => x.FullName == "System.Configuration.ClientConfigPaths") .First() .GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, null); } } }</code>
Verwendung:
Um app.config vorübergehend für einen bestimmten Bereich zu ändern:
<code class="language-csharp">using (AppConfig.Change(tempFileName)) { // 应用程序使用修改后的 app.config }</code>
Um app.config für die gesamte Laufzeit dauerhaft zu ändern:
<code class="language-csharp">// 应用程序使用修改后的 app.config AppConfig.Change(tempFileName);</code>
Das obige ist der detaillierte Inhalt vonWie ändere ich die Standard -App.config zur Laufzeit dynamisch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!