Utworzenie pliku konfiguracyjnego .NET dla pliku .DLL nie jest łatwe. Mechanizm konfiguracyjny .NET ma wiele wbudowanych funkcji, które ułatwiają aktualizację / aktualizację aplikacji i chronią zainstalowane aplikacje przed wzajemnym zadeptaniem plików konfiguracyjnych.
Istnieje duża różnica między sposobem użycia biblioteki DLL a sposobem użycia aplikacji. Jest mało prawdopodobne, aby na tym samym komputerze zainstalowanych było wiele kopii aplikacji dla tego samego użytkownika. Ale możesz mieć 100 różnych aplikacji lub bibliotek, które korzystają z niektórych bibliotek DLL .NET.
Chociaż rzadko zachodzi potrzeba osobnego śledzenia ustawień dla różnych kopii aplikacji w ramach jednego profilu użytkownika, tak jest bardzo ważne mało prawdopodobne, aby wszystkie różne zastosowania biblioteki DLL współdzieliły ze sobą konfigurację. Z tego powodu, gdy pobierasz obiekt konfiguracji przy użyciu metody „normalnej”, zwracany obiekt jest powiązany z konfiguracją domeny aplikacji, w której wykonujesz, a nie z konkretnym zestawem.
Domena aplikacji jest powiązana z zestawem głównym, który załadował zestaw, w którym znajduje się Twój kod. W większości przypadków będzie to zestaw głównego pliku .EXE, który załadował plik .DLL. Możliwe jest rozpinanie innych domen aplikacji w aplikacji, ale musisz jawnie podać informacje o tym, czym jest zestaw główny tej domeny aplikacji.
Z tego powodu procedura tworzenia pliku konfiguracyjnego specyficznego dla biblioteki nie jest tak wygodna. Jest to ten sam proces, którego użyłbyś do utworzenia dowolnego przenośnego pliku konfiguracyjnego niepowiązanego z żadnym konkretnym zestawem, ale dla którego chcesz skorzystać ze schematu XML platformy .NET, sekcji konfiguracji i mechanizmów elementów konfiguracji itp. Oznacza to utworzenie ExeConfigurationFileMap
obiektu , ładowanie danych w celu zidentyfikowania miejsca przechowywania pliku konfiguracyjnego, a następnie wywoływanie ConfigurationManager
. OpenMappedExeConfiguration
aby otworzyć go w nowej Configuration
instancji. To będzie wyciąć cię z ochrony wersji oferowanej przez mechanizm automatycznego generowania ścieżki.
Statystycznie rzecz biorąc, prawdopodobnie używasz tej biblioteki w ustawieniach wewnętrznych i jest mało prawdopodobne, że będziesz mieć wiele aplikacji korzystających z niej na jednym komputerze / użytkowniku. Ale jeśli nie, jest coś, o czym należy pamiętać. Jeśli używasz jednego globalnego pliku konfiguracyjnego dla swojej biblioteki DLL, niezależnie od aplikacji, do której się ona odwołuje, musisz martwić się o konflikty dostępu. Jeśli dwie aplikacje odwołujące się do Twojej biblioteki działają jednocześnie, każda z własnąConfiguration
otwartym obiektem, to kiedy jedna zapisze zmiany, spowoduje to wyjątek przy następnej próbie pobrania lub zapisania danych w drugiej aplikacji.
Najbezpieczniejszym i najprostszym sposobem na obejście tego jest wymaganie, aby zestaw, który ładuje bibliotekę DLL, również podał pewne informacje o sobie lub wykrył je, badając domenę aplikacji zestawu odniesienia. Użyj tego, aby utworzyć strukturę folderów do przechowywania osobnych plików konfiguracji użytkownika dla każdej aplikacji odwołującej się do twojej biblioteki DLL.
Jeśli masz pewność, że chcesz mieć globalne ustawienia dla swojej biblioteki DLL, bez względu na to, gdzie jest do niej odniesienie, musisz określić jej lokalizację zamiast .NET automatycznie wymyślić odpowiednią. Musisz także być agresywny w zarządzaniu dostępem do pliku. Musisz buforować jak najwięcej, utrzymując Configuration
instancję TYLKO tak długo, jak długo trwa ładowanie lub zapisywanie, otwierając bezpośrednio przed i usuwając zaraz po. I w końcu będziesz potrzebować mechanizmu blokującego, aby chronić plik, gdy jest on edytowany przez jedną z aplikacji korzystających z biblioteki.