Czy istnieje odpowiednik app.config
dla bibliotek (DLL)? Jeśli nie, jaki jest najłatwiejszy sposób przechowywania ustawień konfiguracji specyficznych dla biblioteki? Proszę wziąć pod uwagę, że biblioteka może być używana w różnych aplikacjach.
Państwo może mieć osobny plik konfiguracyjny, ale musisz ją przeczytać „ręcznie”, to ConfigurationManager.AppSettings["key"]
będzie tylko do odczytu config Zgromadzenia uruchomiony.
Zakładając, że używasz Visual Studio jako swojego IDE, możesz kliknąć prawym przyciskiem myszy żądany projekt → Dodaj → Nowy element → Plik konfiguracji aplikacji
Spowoduje to dodanie App.config
do folderu projektu, umieszczenie ustawień tam w <appSettings>
sekcji. Jeśli nie używasz programu Visual Studio i dodajesz plik ręcznie, nadaj mu nazwę: DllName.dll.config , w przeciwnym razie poniższy kod nie będzie działał poprawnie.
Teraz do odczytu z tego pliku mamy taką funkcję:
string GetAppSetting(Configuration config, string key)
{
KeyValueConfigurationElement element = config.AppSettings.Settings[key];
if (element != null)
{
string value = element.Value;
if (!string.IsNullOrEmpty(value))
return value;
}
return string.Empty;
}
I aby z niego skorzystać:
Configuration config = null;
string exeConfigPath = this.GetType().Assembly.Location;
try
{
config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
}
catch (Exception ex)
{
//handle errror here.. means DLL has no sattelite configuration file.
}
if (config != null)
{
string myValue = GetAppSetting(config, "myKey");
...
}
Będziesz także musiał dodać odwołanie do przestrzeni nazw System.Configuration, aby klasa ConfigurationManager była dostępna.
Podczas budowania projektu, oprócz biblioteki DLL, będziesz również mieć DllName.dll.config
plik, jest to plik, który musisz opublikować z samą biblioteką DLL.
Powyższy kod to podstawowy przykładowy kod. Osoby zainteresowane pełnym przykładem mogą skorzystać z innej odpowiedzi .
string exeConfigPath = this.GetType().Assembly.Location;
na coś takiego:string exeConfigPath = @"C:\MyFolder\DllFolder\ExeName.exe";
Niestety, możesz mieć tylko jeden plik app.config na plik wykonywalny, więc jeśli masz bibliotekę DLL połączoną z aplikacją, nie mogą one mieć własnych plików app.config.
Rozwiązanie: nie musisz umieszczać pliku App.config w projekcie biblioteki klas.
Umieszczasz plik App.config w aplikacji, która odwołuje się do biblioteki dll biblioteki klas.
Na przykład, powiedzmy, że mamy bibliotekę klas o nazwie MyClasses.dll, która używa pliku app.config w następujący sposób:
Załóżmy teraz, że mamy aplikację Windows o nazwie MyApp.exe, która odwołuje się do MyClasses.dll. Zawierałby plik App.config z wpisem takim jak:
LUB
Plik xml jest najlepszym odpowiednikiem pliku app.config. W razie potrzeby użyj serializacji / deserializacji XML. Możesz to nazwać, jak chcesz. Jeśli Twoja konfiguracja jest „statyczna” i nie wymaga zmian, możesz również dodać ją do projektu jako zasób osadzony.
Mam nadzieję, że to daje jakiś pomysł
źródło
ConfigurationSettings
jest teraz przestarzały i zastąpiony przezConfigurationManager
, więc odpowiednik byłby terazConfigurationManager.AppSettings
Pliki konfiguracyjne mają zakres aplikacji, a nie zakres zestawu. Musisz więc umieścić sekcje konfiguracyjne swojej biblioteki w pliku konfiguracyjnym każdej aplikacji, która korzysta z Twojej biblioteki.
To powiedziawszy, nie jest dobrą praktyką pobieranie konfiguracji z pliku konfiguracyjnego aplikacji, szczególnie z
appSettings
sekcji, w bibliotece klas. Jeśli twoja biblioteka potrzebuje parametrów, prawdopodobnie powinny one być przekazywane jako argumenty metod w konstruktorach, metodach fabrycznych itp. Przez tego, kto wywołuje twoją bibliotekę. Zapobiega to przypadkowemu używaniu przez wywołujące aplikacje pozycji konfiguracji, które były oczekiwane przez bibliotekę klas.To powiedziawszy, pliki konfiguracyjne XML są niezwykle przydatne, więc najlepszym kompromisem, jaki znalazłem, jest użycie niestandardowych sekcji konfiguracji. Możesz umieścić konfigurację swojej biblioteki w pliku XML, który jest automatycznie odczytywany i analizowany przez framework i unikasz potencjalnych wypadków.
Możesz dowiedzieć się więcej o sekcjach konfiguracji niestandardowej w MSDN, a także Phil Haack ma na ich temat fajny artykuł .
źródło
appSettings
sekcje niestandardowe stanowią doskonałą alternatywę; w końcu jest to właściwie to, czego używa członkostwo ASP.NET.Żeby coś zrobić, przerobiłem pierwszą odpowiedź na klasę. Użycie jest takie jak:
źródło
Jeśli dodasz ustawienia do projektu biblioteki klas w programie Visual Studio (właściwości projektu, ustawienia), doda on plik app.config do projektu z odpowiednimi sekcjami userSettings / applatioNSettings i domyślnymi wartościami tych ustawień z ustawień. plik.
Jednak ten plik konfiguracyjny nie będzie używany w czasie wykonywania - zamiast tego biblioteka klas używa pliku konfiguracyjnego swojej aplikacji hostującej.
Uważam, że głównym powodem generowania tego pliku jest to, że można skopiować / wkleić ustawienia do pliku konfiguracyjnego aplikacji hosta.
źródło
Obecnie tworzę wtyczki dla marki oprogramowania detalicznego, które są w rzeczywistości bibliotekami klasy .net. Zgodnie z wymaganiami każda wtyczka musi być skonfigurowana przy użyciu pliku konfiguracyjnego. Po kilku badaniach i testach skompilowałem następującą klasę. Wykonuje swoją pracę bez zarzutu. Zauważ, że nie zaimplementowałem lokalnej obsługi wyjątków w moim przypadku, ponieważ łapię wyjątki na wyższym poziomie.
Może być konieczne wprowadzenie pewnych poprawek, aby uzyskać właściwy przecinek dziesiętny, w przypadku liczb dziesiętnych i podwójnych, ale działa to dobrze w przypadku moich informacji o kulturze ...
Przykład pliku App.Config
Stosowanie:
Kredyty dla Shadow Wizard i MattC
źródło
Odpowiadając na pierwotne pytanie, zazwyczaj dodaję plik konfiguracyjny do mojego projektu testowego jako łącze; można następnie użyć atrybutu DeploymentItem, aby dodać go do folderu Out przebiegu testowego.
W odpowiedzi na komentarze, że zestawy nie mogą być specyficzne dla projektu, mogą i zapewnia to dużą elastyczność, szczególnie. podczas pracy z frameworkami IOC.
źródło
Napotkałem ten sam problem i rozwiązałem go, tworząc klasę statyczną
Parameters
po dodaniu pliku konfiguracyjnego aplikacji do projektu:Następnie uzyskaj parametr taki jak ten:
źródło
zestawy nie mają własnego pliku app.config. Używają pliku app.config aplikacji, która ich używa. Więc jeśli twój zestaw oczekuje pewnych rzeczy w pliku konfiguracyjnym, po prostu upewnij się, że plik konfiguracyjny twojej aplikacji zawiera te wpisy.
Jeśli zestaw jest używany przez wiele aplikacji, każda z tych aplikacji będzie musiała mieć te wpisy w swoim pliku app.config.
To, co poleciłbym, to na przykład zdefiniowanie właściwości klas w twoim zestawie dla tych wartości
Tutaj właściwość ExternalServicesUrl pobiera swoją wartość z pliku konfiguracyjnego aplikacji. Jeśli w którejkolwiek aplikacji używającej tego zestawu brakuje tego ustawienia w pliku konfiguracyjnym, pojawi się wyjątek o jasne jest, że czegoś brakuje.
MissingConfigFileAppSettings to niestandardowy wyjątek. Możesz zgłosić inny wyjątek.
Oczywiście lepszym rozwiązaniem byłoby zapewnienie metody tych klas jako parametrów, a nie poleganie na ustawieniach pliku konfiguracyjnego. W ten sposób aplikacje korzystające z tych klas mogą decydować, skąd i jak dostarczają te wartości.
źródło
Użyj Dodaj istniejący element, wybierz konfigurację aplikacji z projektu dll. Przed kliknięciem przycisku dodaj użyj małej strzałki w dół po prawej stronie przycisku dodawania, aby „dodać jako link”
Robię to cały czas w moim dev.
źródło
Preambuła : używam NET 2.0;
Rozwiązanie przesłane przez Yiannisa Leoussisa jest do zaakceptowania, ale miałem z nim pewien problem.
Po pierwsze,
static AppSettingsSection AppSettings = (AppSettingsSection)myDllConfig.GetSection("appSettings");
zwraca null. Musiałem to zmienić nastatic AppSettingSection = myDllConfig.AppSettings;
Wtedy
return (T)Convert.ChangeType(AppSettings.Settings[name].Value, typeof(T), nfi);
nie ma haczyka na wyjątki. Więc zmieniłem toDziała to bardzo dobrze, ale jeśli masz inną bibliotekę dll, za każdym razem musisz przepisać kod dla każdego zestawu. Tak więc to jest moja wersja dla klasy do tworzenia instancji za każdym razem, gdy potrzebujesz.
W przypadku konfiguracji:
Użyj go jako:
źródło
O ile wiem, musisz skopiować i wkleić żądane sekcje z biblioteki .config do pliku .config aplikacji. Otrzymujesz tylko 1 plik app.config na instancję wykonywalną.
źródło
Dlaczego nie użyć:
[ProjectNamespace].Properties.Settings.Default.[KeyProperty]
dla C #My.Settings.[KeyProperty]
dla VB.NETWystarczy wizualnie zaktualizować te właściwości w czasie projektowania poprzez:
[Solution Project]->Properties->Settings
źródło
użycie z konfiguracji musi być bardzo łatwe w następujący sposób:
aby uzyskać więcej informacji, zobacz MiniConfig
źródło