Ich habe das folgende Problem:
Wir haben eine Anwendung, die Module lädt (Add-Ons). Diese Module benötigen möglicherweise Einträge in der app.config (z. B. WCF-Konfiguration). Da die Module dynamisch geladen werden, möchte ich diese Einträge nicht in der Datei app.config meiner Anwendung haben.
Was ich tun möchte, ist Folgendes:
- Erstellen Sie eine neue app.config im Speicher, die die Konfigurationsabschnitte aus den Modulen enthält
- Sagen Sie meiner Anwendung, dass sie diese neue app.config verwenden soll
Hinweis: Ich möchte die Standard-app.config nicht überschreiben!
Es sollte transparent funktionieren, damit zum Beispiel ConfigurationManager.AppSettings
diese neue Datei verwendet wird.
Bei der Bewertung dieses Problems habe ich die gleiche Lösung gefunden, die hier bereitgestellt wird: Laden Sie app.config mit nunit neu .
Leider scheint es nichts zu tun, da ich die Daten immer noch aus der normalen app.config bekomme.
Ich habe diesen Code verwendet, um ihn zu testen:
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
var combinedConfig = string.Format(CONFIG2, CONFIG);
var tempFileName = Path.GetTempFileName();
using (var writer = new StreamWriter(tempFileName))
{
writer.Write(combinedConfig);
}
using(AppConfig.Change(tempFileName))
{
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
}
Es gibt zweimal dieselben Werte aus, combinedConfig
enthält jedoch andere Werte als die normale app.config.
quelle
AppDomain
mit der entsprechenden Konfigurationsdatei ist keine Option?Reload app.config with nunit
könnte funktionieren, nicht sicher, ob er beim Anwendungseintrag verwendet wird, bevor eine Konfiguration geladen wird.Antworten:
Der Hack in der verknüpften Frage funktioniert, wenn er verwendet wird, bevor das Konfigurationssystem zum ersten Mal verwendet wird. Danach funktioniert es nicht mehr.
Der Grund:
Es gibt eine Klasse
ClientConfigPaths
, die die Pfade zwischenspeichert. Daher wird der Pfad auch nach dem Ändern mitSetData
nicht erneut gelesen, da bereits zwischengespeicherte Werte vorhanden sind. Die Lösung besteht darin, auch diese zu entfernen:Die Verwendung ist wie folgt:
Wenn Sie die verwendete app.config für die gesamte Laufzeit Ihrer Anwendung ändern möchten, fügen Sie sie einfach
AppConfig.Change(tempFileName)
ohne Verwendung irgendwo am Anfang Ihrer Anwendung ein.quelle
Sie können versuchen, Configuration und Add ConfigurationSection zur Laufzeit zu verwenden
EDIT: Hier ist eine Lösung basierend auf Reflexion (aber nicht sehr schön)
Klasse erstellen von abgeleitet
IInternalConfigSystem
dann über Reflexion auf privates Feld in setzen
ConfigurationManager
quelle
file_path
. Dadurch wird der Abschnitt für Benutzer von nicht verfügbarConfigurationManager.GetSection
, daGetSection
die Standard-app.config verwendet wird.@ Daniel-Lösung funktioniert OK. Eine ähnliche Lösung mit mehr Erklärung ist in der scharfen Ecke. Der Vollständigkeit halber möchte ich meine Version teilen: mit
using
und die Bit-Flags abgekürzt.quelle
Wenn jemand interessiert ist, ist hier eine Methode, die auf Mono funktioniert.
quelle
Daniels Lösung scheint sogar für nachgeschaltete Assemblys zu funktionieren, die ich zuvor mit AppDomain.SetData verwendet hatte, aber nicht wusste, wie die internen Konfigurationsflags zurückgesetzt werden sollten
Für Interessierte in C ++ / CLI konvertiert
quelle
Wenn Ihre Konfigurationsdatei nur mit Schlüssel / Werten in "appSettings" geschrieben wurde, können Sie eine andere Datei mit folgendem Code lesen:
Dann können Sie den Abschnitt lesen. Einstellungen als Auflistung von KeyValueConfigurationElement.
quelle
ConfigurationManager.GetSection
ich die neue Datei, die ich erstellt habe , lesen lassen. Ihre Lösung macht das nicht.ConfigurationManager.GetSection
Verwendet die Standard-app.config. Die Konfigurationsdatei, mit der Sie geöffnet haben, ist ihm egalOpenMappedExeConfiguration
.Wunderbare Diskussion, ich habe der ResetConfigMechanism-Methode weitere Kommentare hinzugefügt, um die Magie hinter den Anweisungen / Aufrufen in der Methode zu verstehen. Es wurde auch eine Überprüfung des Dateipfads hinzugefügt
quelle
Daniel, wenn möglich, versuche andere Konfigurationsmechanismen zu verwenden. Wir haben diese Route durchlaufen, auf der wir je nach Umgebung / Profil / Gruppe unterschiedliche statische / dynamische Konfigurationsdateien hatten, und es wurde am Ende ziemlich chaotisch.
Sie können eine Art Profil-WebService ausprobieren, bei dem Sie nur eine Webdienst-URL vom Client angeben. Abhängig von den Details des Clients (möglicherweise Überschreibungen auf Gruppen- / Benutzerebene) werden alle erforderlichen Konfigurationen geladen. Wir haben auch MS Enterprise Library für einen Teil davon verwendet.
Das heißt, Sie stellen die Konfiguration nicht mit Ihrem Client bereit und können sie getrennt von Ihren Clients verwalten
quelle