Ich versuche, meiner DLL eine app.config-Datei hinzuzufügen, aber alle Versuche sind fehlgeschlagen.
Laut MusicGenesis unter " Konfigurationsinformationen in eine DLL einfügen" sollte dies kein Problem sein. Also mache ich offensichtlich etwas falsch ...
Der folgende Code sollte meinen ConnectionString von meiner DLL zurückgeben:
return ConfigurationManager.AppSettings["ConnectionString"];
Wenn ich jedoch die Datei app.config in meine Konsolenanwendung kopiere, funktioniert dies einwandfrei.
Irgendwelche Ideen?
c#
app-config
Megabyte
quelle
quelle
Antworten:
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 neueConfiguration
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.quelle
Wenn Sie Einstellungen aus der Konfigurationsdatei der DLL lesen möchten, jedoch nicht aus den Stammanwendungen web.config oder app.config, verwenden Sie den folgenden Code, um die Konfiguration in der DLL zu lesen.
quelle
Ich hatte das gleiche Problem und suchte mehrere Stunden im Internet, konnte aber keine Lösung finden, also machte ich meine eigene. Ich habe mich gefragt, warum das .net-Konfigurationssystem so unflexibel ist.
Hintergrund: Ich möchte, dass meine DAL.dll eine eigene Konfigurationsdatei für Datenbank- und DAL-Einstellungen hat. Ich benötige auch die app.config für Enterprise Library und ihre eigenen Konfigurationen. Ich brauche also sowohl die app.config als auch die dll.config.
Was ich nicht wollte, ist, jede Eigenschaft / Einstellung von der App an meine DAL-Ebene weiterzuleiten!
Das Biegen der "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" ist nicht möglich, da ich sie für das normale Verhalten von app.config benötige.
Meine Anforderungen / Standpunkte waren:
Ich habe die Datei Settings.cs geändert und eine Methode implementiert, die die ClassLibrary1.dll.config öffnet und die Abschnittsinformationen in einem privaten Feld liest. Danach habe ich "this [string propertyName]" überschrieben, damit die generierten Settings.Desginer.cs anstelle der Basisklasse meine neue Eigenschaft aufrufen. Dort wird die Einstellung aus der Liste ausgelesen.
Schließlich gibt es den folgenden Code:
Sie müssen lediglich Ihre ClassLibrary1.dll.config aus dem ClassLibrary1-Ausgabeverzeichnis in das Ausgabeverzeichnis Ihrer Anwendung kopieren. Vielleicht findet es jemand nützlich.
quelle
Bei Verwendung von ConfigurationManager bin ich mir ziemlich sicher, dass die Prozess- /
AppDomain
Konfigurationsdatei (app.config / web.config) geladen wird. Wenn Sie eine bestimmte Konfigurationsdatei laden möchten, müssen Sie diese Datei speziell nach ihrem Namen fragen ...Du könntest es versuchen:
quelle
ConfigurationManager.AppSettings gibt die für die Anwendung definierten Einstellungen zurück, nicht für die spezifische DLL. Sie können darauf zugreifen, aber es werden die Anwendungseinstellungen zurückgegeben.
Wenn Sie Ihre DLL aus einer anderen Anwendung verwenden, befindet sich der ConnectionString in den App-Einstellungen der Anwendung.
quelle
Ich weiß, dass dies zu spät für die Party ist, aber ich dachte, ich würde die Lösung, die ich für DLLs verwende, teilen.
Ich bin eher ein KISS-Denker. Wenn ich also eine .NET-DLL habe, die externe Datenpunkte speichern möchte, die steuern, wie es funktioniert oder wohin es geht usw., erstelle ich einfach eine "config" -Klasse, die nur öffentliche Eigenschaften hat das speichert alle Datenpunkte, die es benötigt, und dass ich in der Lage sein möchte, außerhalb der DLL zu steuern, um zu verhindern, dass es neu kompiliert wird, um die Änderungen vorzunehmen. Dann verwende ich die XML-Serialisierung von .Net, um die Objektdarstellung der Klasse zu speichern und in eine Datei zu laden.
Es gibt dann viele Möglichkeiten, es zu lesen und darauf zuzugreifen, von einem Singleton, einer statischen Dienstprogrammklasse bis hin zu Erweiterungsmethoden usw. Dies hängt davon ab, wie Ihre DLL strukturiert ist und welche Methode am besten zu Ihrer DLL passt.
quelle
Wenn Sie richtig sind, können Sie die Konfigurationsdatei einer DLL lesen. Ich hatte einen Tag lang damit zu kämpfen, bis ich herausfand, dass meine Konfigurationsdatei das Problem war. Siehe meinen Code unten. es konnte rennen.
mein
Plugin1.dll.config
sah aus wie unten;Ich habe herausgefunden, dass in meiner Konfigurationsdatei das
<appSettings>
Tag fehlt. Schauen Sie sich also um, Ihr Problem hätte anders sein können, aber nicht so weit von meinem entfernt.quelle
Da sich die Assembly in einem temporären Cache befindet, sollten Sie den Pfad kombinieren, um die Konfiguration der DLL abzurufen:
quelle
Wenn Sie Bibliotheken verwenden, die hinter den Kulissen eine große Menge an Verwirrung nachschlagen, wie z. B. WCF, sollten Sie Folgendes in Betracht ziehen:
Oder in PowerShell:
IMO diese Technik ist ein Code-Geruch und ist wirklich nur für die Verwendung in Ad-hoc-Skripten geeignet. Wenn Sie dies im Produktionscode tun möchten, ist es möglicherweise Zeit für eine Überprüfung der Architektur.
Folgendes wird NICHT empfohlen: Aus
technischen Gründen gibt es hier eine Variation des Themas. Sie können einen statischen Konstruktor in einer der in der DLL enthaltenen Klassen erstellen und diesen Aufruf von dort aus ausführen. Ich würde dies nur als letzten Ausweg empfehlen.
quelle
Die vollständige Lösung wird nicht oft an einem Ort gefunden ...
1) Erstellen Sie eine App-Konfigurationsdatei und nennen Sie sie "yourDllName.dll.config".
2) Klicken Sie mit der rechten Maustaste auf die oben im VS Solution Explorer erstellte Konfigurationsdatei und klicken Sie auf Eigenschaften
--- set "Build Action" = Content
--- set "Copy To Output Directory" = Always
3) Fügen Sie der Konfigurationsdatei (yourDllName.dll.config) mit IhremKeyName und IhremKeyValue einen Abschnitt appSettings hinzu
4) Fügen Sie System.Configuration zu Ihren DLL- / Klassen- / Projektreferenzen hinzu.
5) Fügen Sie die using-Anweisungen zu Ihrem Code hinzu, in dem Sie auf die Konfigurationseinstellung zugreifen möchten
6) Um auf den Wert zuzugreifen
7) freue dich, es funktioniert
IMHO sollte dies nur bei der Entwicklung einer neuen DLL / Bibliothek verwendet werden.
Die Konfigurationsdatei ist eine hervorragende Referenz, wenn Sie die appSettings der DLL zu Ihrer eigentlichen Anwendung hinzufügen.
quelle
Diese Konfigurationsdateien scheinen wirklich verwirrend zu sein, da sich ihr Verhalten von der Entwicklungsumgebung zur Bereitstellung ändert. Anscheinend kann eine DLL eine eigene Konfigurationsdatei haben, aber sobald Sie die DLL (zusammen mit ihrer Konfigurationsdatei) an eine andere Stelle kopieren und einfügen, funktioniert das Ganze nicht mehr. Die einzige Lösung besteht darin, die app.config-Dateien manuell in einer einzigen Datei zusammenzuführen, die nur von der Exec verwendet wird. Zum Beispiel hat myapp.exe eine myapp.exe.config-Datei, die alle Einstellungen für alle von myapp.exe verwendeten DLLs enthält. Ich benutze VS 2008.
quelle
Ich habe eine gute Lösung für dieses Problem gefunden. Ich verwende VS 2008 C #. Meine Lösung beinhaltet die Verwendung unterschiedlicher Namespaces zwischen mehreren Konfigurationsdateien. Ich habe die Lösung in meinem Blog veröffentlicht: http://tommiecarter.blogspot.com/2011/02/how-to-access-multiple-config-files-in.html .
Beispielsweise:
Dieser Namespace liest / schreibt DLL-Einstellungen:
Dieser Namespace liest / schreibt die exe-Einstellungen:
Im Artikel werden einige Einschränkungen erwähnt. HTH
quelle
Wie Marc sagt, ist dies nicht möglich (obwohl Sie mit Visual Studio eine Anwendungskonfigurationsdatei in ein Klassenbibliotheksprojekt einfügen können).
Vielleicht möchten Sie die AssemblySettings- Klasse überprüfen, die Assembly- Konfigurationsdateien zu ermöglichen scheint.
quelle
In diesem Beitrag wurde ein ähnliches Problem besprochen und mein Problem gelöst. Wie lade ich eine separate Anwendungseinstellungsdatei dynamisch und füge sie mit den aktuellen Einstellungen zusammen? könnte helpfu sein
quelle
Für eine DLL sollte dies nicht von der Konfiguration abhängen, da die Konfiguration der Anwendung und nicht der DLL gehört.
Dies wird bei erklärt hier
quelle
Sie können diesen Code verwenden:
quelle