Es ist aus gutem Grund nicht trivial, eine .NET-Konfigurationsdatei für eine DLL zu erstellen. Der .NET-Konfigurationsmechanismus verfügt über zahlreiche integrierte Funktionen, die das einfache Aktualisieren / Aktualisieren der App erleichtern und die installierten Apps vor dem gegenseitigen Trampeln der Konfigurationsdateien schützen.
Es gibt einen großen Unterschied zwischen der Verwendung einer DLL und der Verwendung einer Anwendung. Es ist unwahrscheinlich, dass mehrere Kopien einer Anwendung für denselben Benutzer auf demselben Computer installiert sind. Möglicherweise verfügen Sie jedoch über 100 verschiedene Apps oder Bibliotheken, die alle eine .NET-DLL verwenden.
Während es selten erforderlich ist, Einstellungen für verschiedene Kopien einer App innerhalb eines Benutzerprofils separat zu verfolgen, ist es sehr unwahrscheinlich, dass alle unterschiedlichen Verwendungen einer DLL die Konfiguration miteinander teilen sollen. Aus diesem Grund ist das Objekt, das Sie zurückerhalten, beim Abrufen eines Konfigurationsobjekts mit der "normalen" Methode an die Konfiguration der App-Domäne gebunden, in der Sie ausgeführt werden, und nicht an die bestimmte Assembly.
Die App-Domäne ist an die Root-Assembly gebunden, die die Assembly geladen hat, in der sich Ihr Code tatsächlich befindet. In den meisten Fällen ist dies die Assembly Ihrer Haupt-EXE-Datei, die die DLL geladen hat. Es ist möglich, andere App-Domänen innerhalb einer Anwendung zu starten, Sie müssen jedoch explizit Informationen zur Stammassemblierung dieser App-Domäne bereitstellen.
Aus diesem Grund ist das Verfahren zum Erstellen einer bibliotheksspezifischen Konfigurationsdatei nicht so bequem. Dies ist der gleiche Prozess, den Sie zum Erstellen einer beliebigen tragbaren Konfigurationsdatei verwenden würden, die nicht an eine bestimmte Assembly gebunden ist, für die Sie jedoch das XML-Schema, den Konfigurationsabschnitt und die Konfigurationselementmechanismen von .NET usw. verwenden möchten. Dazu müssen Sie ein ExeConfigurationFileMap
Objekt erstellen Laden Sie die Daten, um festzustellen, wo die Konfigurationsdatei gespeichert wird, und rufen Sie dann aufConfigurationManager
. OpenMappedExeConfiguration
um es in eine neue Configuration
Instanz zu öffnen . Dadurch werden Sie vom Versionsschutz abgeschnitten, den der automatische Pfadgenerierungsmechanismus bietet.
Statistisch gesehen verwenden Sie diese Bibliothek wahrscheinlich in einer internen Umgebung, und es ist unwahrscheinlich, dass Sie mehrere Apps auf einem Computer / Benutzer verwenden. Aber wenn nicht, gibt es etwas , das man im Auge behalten sollte. Wenn Sie eine einzelne globale Konfigurationsdatei für Ihre DLL verwenden, müssen Sie sich unabhängig von der App, auf die sie verweist, über Zugriffskonflikte Gedanken machen. Wenn zwei Apps, die auf Ihre Bibliothek verweisen, gleichzeitig ausgeführt werden und jeweils ein eigenes Configuration
Objekt geöffnet ist, wird beim Speichern von Änderungen beim nächsten Versuch, Daten in der anderen App abzurufen oder zu speichern, eine Ausnahme ausgelöst.
Der sicherste und einfachste Weg, dies zu umgehen, besteht darin, zu verlangen, dass die Assembly, die Ihre DLL lädt, auch einige Informationen über sich selbst bereitstellt, oder diese zu erkennen, indem Sie die App-Domäne der referenzierenden Assembly untersuchen. Verwenden Sie diese Option, um eine Art Ordnerstruktur zu erstellen, in der separate Benutzerkonfigurationsdateien für jede App gespeichert werden, die auf Ihre DLL verweist.
Wenn Sie sicher sind , dass Sie globale Einstellungen für Ihre DLL haben möchten, unabhängig davon, wo auf sie verwiesen wird, müssen Sie Ihren Speicherort dafür bestimmen, anstatt .NET automatisch einen geeigneten zu ermitteln. Sie müssen auch aggressiv bei der Verwaltung des Zugriffs auf die Datei sein. Sie müssen so viel wie möglich zwischenspeichern und die Configuration
Instanz NUR so lange behalten, wie sie zum Laden oder Speichern benötigt wird. Sie muss unmittelbar vor und sofort nach dem Öffnen geöffnet werden. Und schließlich benötigen Sie einen Sperrmechanismus, um die Datei zu schützen, während sie von einer der Apps bearbeitet wird, die die Bibliothek verwenden.