odczyt z pliku app.config


135

Próbuję odczytać StartingMonthColumn i CategoryHeadingColumn z poniższego pliku app.config przy użyciu kodu

ConfigurationSettings.AppSettings["StartingMonthColumn"]

ale zwraca wartość null, również ConfigurationSettings.AppSettings.Count zwraca zero

Pomóż mi to przeczytać w mojej aplikacji Windows

<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="CTARepository.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <CTARepository.Properties.Settings>
            <setting name="Setting" serializeAs="String">
                <value />
            </setting>
        </CTARepository.Properties.Settings>
    </userSettings>
    <appSettings>
        <add key="StartingMonthColumn" value="7"/>
        <add key="CategoryHeadingColumn" value="1"/>
    </appSettings>
</configuration>

Czy próbujesz uruchomić aplikację z folderu \ bin \ debug podczas zmiany pliku konfiguracyjnego w katalogu głównym projektu? W przeciwnym razie zmień konfigurację i ponownie skompiluj kod po uruchomieniu czyszczenia.
— Kangkan

1
Plik nie ma nazwy „app.config”, prawda? Na pewno tak jest nazywane w Twoim projekcie, ale w katalogu wyjściowym aplikacji powinno mieć taką samą nazwę jak plik wyjściowy + „.config” (np. „MyLibrary.dll.config” lub „MyProgram.exe.config ", etc ...)
— BrainSlugs83

@ BrianSlugs83 dzięki kolego, zastanawiałem się, dlaczego moja aplikacja się zawiesza. Teraz, po dwóch dniach wyszukiwania wszędzie, odpowiedź znajduje się w komentarzu. Po prostu miałem „app.config” i brak „MyProgram.exe.config”.
— śmiglidigli

Aby znaleźć rozwiązanie, spójrz na stackoverflow.com/questions/1189364/… . Dzięki
— Ariful Islam

Odpowiedzi:


174

Ustawienia konfiguracji .AppSettings jest przestarzałe , zamiast tego należy użyć Configuration Manager .AppSettings (konieczne będzie dodanie odwołania do System.Configuration )

int value = Int32.Parse(ConfigurationManager.AppSettings["StartingMonthColumn"]);

Jeśli nadal masz problemy z odczytem ustawień aplikacji, sprawdź, czy app.configplik ma prawidłową nazwę. W szczególności powinien mieć nazwę zgodnie z wykonującym się zestawem, tj. MyApp.exe.config, I powinien znajdować się w tym samym katalogu, co MyApp.exe.


2
Jeśli ConfigurationSettings.AppSettings ["StartingMonthColumn"] zwróci wartość null lub pusty ciąg, podejrzewam, że Int32.Parse zgłosi wyjątek przy próbie przeanalizowania tych wartości.
— Bittercoder

@bittercoder, tak, ale twój plik app.config i tak powinien zawsze mieć poprawną konfigurację. Jeśli OP chce dodać tam jakąś formę obsługi, np. TryParse, to jak najbardziej mogą. Jednak to nie było pytanie.
— James,

2
Zauważ, że możesz również uzyskać dostęp do silnie wpisanych wersji wartości, poprzez Settings.Default. * (Tj. W tym przypadku będzie to Settings.Default.StartingMonthColumn).
— BrainSlugs83

@ BrainSlugs83 Zwróć uwagę, że mylące są ustawienia użytkownika z ustawieniami aplikacji. Jeśli chcesz uzyskać dostęp do ustawień aplikacji w sposób jednoznaczny, musisz zaimplementować niestandardową sekcję konfiguracji
— James,

To nie jest poprawne, będzie pobierać wartości z app.config niezależnie od tego, czy zakres wartości to „Użytkownik” czy „Aplikacja” (w projektancie GUI możesz wybrać zakres dla każdego ustawienia).
— BrainSlugs83

21

Tylko do przyszłego wykorzystania, wystarczy dodać System.Configurationdo swojej biblioteki referencji:

wprowadź opis obrazu tutaj


2
twoja odpowiedź jest lepsza niż pierwsza odpowiedź tutaj, wszyscy zapomnieli powiedzieć, że musisz dodać odniesienie
— essanousy

20

ConfigurationSettings.AppSettings jest przestarzałe , zobacz tutaj:

http://msdn.microsoft.com/en-us/library/system.configuration.configurationsettings.appsettings.aspx

To powiedziawszy, powinno nadal działać.

To tylko sugestia, ale czy potwierdziłeś, że konfiguracja Twojej aplikacji jest tą, której używa Twój plik wykonywalny?

Spróbuj dołączyć debugger i sprawdź następującą wartość:

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

A następnie otwarcie pliku konfiguracyjnego i sprawdzenie, czy sekcja jest zgodna z oczekiwaniami.


Cześć, Bittercoder, gdy próbuję uzyskać wartość AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, otrzymuję C: \\ Program Files \\ Microsoft Office \\ OFFICE11 \\ exCEL.EXE.config, który nie jest moim plikiem konfiguracyjnym ... co powinno robię
— Sathish

To jest poprawny plik konfiguracyjny ... może być tak, że się tego nie spodziewałeś. W rzeczywistości w tym przypadku uważam, że C: \ Program Files \ Microsoft Office \ OFFICE11 \ Excel.EXE.config jest konfiguracją globalną, a jeśli umieścisz plik o podobnej nazwie Excel.EXE.config w tym samym katalogu co zestaw, jest to skąd będą odczytywane ustawienia aplikacji. Zobacz te linki, aby uzyskać szczegółowe informacje: dotnet247.com/247reference/msgs/56/281797.aspx stackoverflow.com/questions/2288575/ ...
— Bittercoder


7

To:

Console.WriteLine( "StartingMonthColumn is {0}", ConfigurationManager.AppSettings["StartingMonthColumn"]);

dla mnie działa dobrze.

Zauważ, że ConfigurationManagerznajduje się w System.Configurationprzestrzeni nazw (więc prawdopodobnie będziesz potrzebować using System.Configuration;instrukcji), a ponieważ to, co czytasz, ma typ ciągu, musisz przeanalizować to, co wczytujesz, aby użyć go jako liczby.

Upewnij się również, że ustawiłeś system.configuration.dlljako odniesienie w swoim projekcie lub skrypcie kompilacji.


jakie odniesienie należy dodać, aby uzyskać ConfigurationManager.Appsettings Używam .Net 2.0 Framework
— Sathish

1
Potrzebujesz odniesienia do System.Configuration.dll. ConfigurationManagerKlasa została dodana w .NET 2.0, więc powinno być OK.
— Michael Burr

7

Powód jest prosty, twoje wywołanie ConfigurationSettings.AppSettingsnie zwraca wymaganego pliku konfiguracyjnego. Wypróbuj jeden z następujących sposobów:

  • Upewnij się, że konfiguracja aplikacji ma taką samą nazwę jak plik exe aplikacji - z dołączonym rozszerzeniem .config, np. MyApp.exe.config
  • LUB możesz użyć ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location).AppSettings["StartingMonthColumn"]

Mam nadzieję że to pomoże


3

Spróbuj odbudować projekt - kopiuje zawartość App.configdo „<YourProjectName.exe> ​​.config” w bibliotece kompilacji.


2

Dodaj również klucz „StartingMonthColumn” w pliku App.config, z którego uruchamiasz aplikację, na przykład w pliku App.config projektu testowego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.