2009-04-16 20 views
22

Mam niektóre ustawienia w moim app.config, które zamierzam być "globalne" - tj. każdy użytkownik może je zmienić, a wszyscy użytkownicy otrzymują to samo ustawienie.Dlaczego ustawienia aplikacji są tylko do odczytu w pliku app.config?

Ale jeśli nie zmienię ich na ustawienia użytkownika, są one tylko do odczytu.

Dlaczego tak jest?

A jak powinienem zachować stabilność globalną aplikacji?

Edit:

Właściwie jest to aplikacja usługa Windows, który działa jako usługa jako LocalSystem. Może być również uruchamiany ręcznie przez lokalnego administratora z argumentem "/ config", który uruchamia formularz okna do edycji wartości konfiguracyjnych.

W obu sytuacjach będzie miał dostęp do zapisu %PROGRAMFILES%.

The Way I Am dostępu do moich ustawień jest thusly:

Settings.Default.MySetting = MyNewValue; 

A kiedy MySetting jest ustawiony do aplikacji (w moim właściwości projektu, Settings.settings), pojawia się błąd kompilacji „MySetting jest odczytywany tylko".

Jestem nowy w tej dziedzinie i nie znalazłem jeszcze dobrego wyjaśnienia, w jaki sposób należy to zrobić. Na przykład, dlaczego muszę powiedzieć "Domyślny" i co to właściwie oznacza? Nie mam pojęcia. Jeśli ktokolwiek może skierować mnie do samouczka dotyczącego używania app.config, byłoby to bardzo pomocne.

Odpowiedz

47

Prawdziwy pełna odpowiedź:

Ustawienia app.config są tylko do odczytu, ponieważ istnieją 2 rodzaje ustawień:

  1. Ustawienia aplikacji
  2. USTAW.UŻYTKOW

pierwsza nie zmieni się, chyba że wydawca aplikacji opublikuje nową wersję. Druga nie jest przechowywana w pliku app.config, ale w pliku user.config. W przypadku zrzutu tego pliku user.config app.config zapewnia wartość domyślną.

Jeśli MySetting to ustawienie użytkownika:

Settings.Default.MySetting = MyNewValue; 
Settings.Default.Save(); 

To utworzy plik user.config na [User Local Settings Application Data]\[company name]\[application].exe[hash string]\[version] z nowymi ustawieniami, a te ustawienia będą przeważać nad ustawieniami w pliku app.config.

+1

To powinno być oznaczone jako "Odpowiedź". Bardzo dobrze wyjaśnione. – Askolein

+0

Witam. Czy możesz spojrzeć na to pytanie? http://stackoverflow.com/questions/39791332/application-creates-folder-with-in-place-for-space-in-name-when-using-proper – Pritam

4

Powód: Ustawienia aplikacji mają być przechowywane w folderze Aplikacje w obszarze Pliki programów, w których użytkownik nie ma uprawnień do zapisu.

Jak: Nie ma domyślne wsparcie dla „All Users”, ale powinno być możliwe, aby ustawić własny plik konfiguracyjny zwyczaj w folderze publicznym lub korzystać z bazy danych.

1

Nie jestem do końca pewien, co masz na myśli. Czy masz na myśli, że pozwoliłeś użytkownikom na zmianę app.config z interfejsu użytkownika, a zmiany nie są zachowywane?

nazwałeś

ConfigurationManager.RefreshSection("appSettings"); 

i

Configuration.Save(); 
+1

Zobacz moją zmianę. Używam Settings.Default, a nie ConfigurationManager - czy czyta app.config? – Blorgbeard

0

Jednym z powodów jest to, że plik jest w folderze app.config Twojej aplikacji w katalogu Program Files, a wszystko w Program Files jest tylko do odczytu domyślnie dla standardowych użytkowników.

Innym jest to, że ustawienia app.config mają zastosowanie do całego systemu. Jeśli jeden użytkownik wprowadzi zmianę, wpłynie to na innych użytkowników. Normalni użytkownicy nie powinni mieć możliwości dokonywania takich zmian. Wszystko, co może mieć wpływ na wielu użytkowników, powinno być ustawione tylko na administratora systemu. Ustawienia dla poszczególnych użytkowników znajdują się w folderze Dane aplikacji każdego użytkownika.

+0

To dobrze - chcę tylko, aby administrator systemu mógł zmienić te systemowe ustawienia z poziomu mojego programu. Ale to nie wydaje się możliwe, nawet jeśli jestem administratorem. – Blorgbeard

0

Ustawienia konfiguracji są zapisywane w pamięci podręcznej po uruchomieniu aplikacji. możesz poradzić sobie z plikiem app.config jako xml, aby zmienić wartości.

3

Po prostu: nie ma miejsca na maszynie, którą każdy może zmienić, chyba że nadasz takie uprawnienia.

Istnieje kilka sposobów radzenia sobie z tego rodzaju sytuacji:

  • Można utworzyć plik konfiguracyjny/niektóre ustawienia rejestru, umieścić to w „wszystkich użytkowników” profilu i Grant „każdy” prawa zmienić ten konkretny plik. Podczas instalacji można zautomatyzować procedurę przyznawania odpowiednich uprawnień, a program może obsłużyć resztę.

  • Możesz wykorzystać UAC, aby upewnić się, że bieżący użytkownik ma odpowiednie uprawnienia do zmiany ustawienia ogólnosystemowego. Jest to zalecane podejście, ale oznacza również, że nie każdy może zmienić określone ustawienia.

  • Możesz użyć udostępnionej bazy danych i zapisać tam swoje ustawienia.

  • ???

Nie polecam zmieniać pozycji w katalogu plików programów ani zmieniać domyślnych uprawnień.

EDYCJA: Jako lokalny system rzeczywiście zapisałeś uprawnienia do katalogu plików programów. Jeśli pojawi się błąd "Tylko do odczytu", oznacza to, że same ustawienia są tylko do odczytu. Będziesz musiał użyć menedżera konfiguracji, aby móc zmienić ustawienia w plikach konfiguracyjnych.

Mam nadzieję, że to pomoże.

+0

Czy możesz rozwinąć w "użyciu menedżera konfiguracji"? Jakieś pomocne linki? – Blorgbeard

+1

Oczywiście, spójrz tutaj: http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx –

Powiązane problemy