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.