2013-02-18 15 views
7

Mój program ma wbudowane pewne ustawienia, w których wszystkie mają zakres użytkownika. Jednak po uruchomieniu programu tworzy on tylko plik AppName.exe.config, który zawiera ustawienia.Nie utworzono pliku user.config, ale plik app.config to?

Zapisanie ustawienia później podczas wykonywania powoduje utworzenie pliku user.config (który wcześniej nie istniał) w AppData/Local/AppName/location, ale ten plik zawiera tylko zapisane ustawienie.

Dlaczego tak się dzieje? Dlaczego nie stworzy pliku user.config lub nie użyje go przy starcie, jeśli istnieje?

+0

+1 ode mnie. Proszę odeślij rozwiązanie, do którego przychodzisz, ponieważ jest to dobre pytanie IMHO. Istnieje wiele możliwości obejścia pliku app.config pomiędzy różnymi aplikacjami (tj. Nie tylko klasami/formularzami w tej samej domenie aplikacji), a te będą _prawdopodobnie_ podniosą wszystkie pliki użytkownika.config są obecne, gdy aplikacja uruchamia się (co mogłoby zająć się twoimi problemami dotyczącymi wielu plików), ale nic, co mogę znaleźć, nie odnosi się bezpośrednio do sytuacji uzyskania aktualnych współdzielonych konfiguracji, w których plik (pliki) user.config mógł zostać zaktualizowany przez jedną z aplikacji do udostępniania W czasie wykonywania. – Sepster

Odpowiedz

3

Od Application Settings Architecture at MSDN:

  1. Ustawienia aplikacji o zasięgu mogą być przechowywane zarówno w machine.config lub plików app.exe.config. Machine.config jest zawsze tylko do odczytu, a app.exe.config jest ograniczony względami bezpieczeństwa do odczytu tylko dla większości aplikacji.

  2. Ustawienia o zasięgu użytkownika można przechowywać w plikach app.exe.config, w takim przypadku są one traktowane jako statyczne wartości domyślne.

  3. dla domyślnych ustawień użytkownika scoped są przechowywane w nowym pliku, user.config, gdzie użytkownik jest nazwą użytkownika osoby aktualnie wykonującego aplikację. Można określić wartość domyślną dla ustawienia użytkownika o zakresie za pomocą DefaultSettingValueAttribute. Ponieważ ustawienia użytkownika w zakresie często zmieniają się podczas wykonywania aplikacji, user.config jest zawsze zawsze czytać/pisać.

Co widzisz najpierw jest (co pan nazywa) Twój „zbudowany w ustawieniach” są przechowywane jako (co nazywa Microsoft) „domyślnych ustawień użytkownika” statyczna o zasięgu, które są zapisywane w app.exe (jak na 2).

A następnie, po zapisaniu ustawień w środowisku wykonawczym, są one traktowane jako "inne niż domyślne" ustawienia o zasięgu użytkownika i są zapisywane w pliku user.config (jak na 3), więc dlaczego tylko wtedy widzisz utworzony plik user.config.

Podsumowując, plik user.config dla użytkownika nie jest potrzebny, o ile ustawienia o zakresie użytkownika są takie same (domyślne) dla wszystkich.

+0

Czy nie można po prostu popchnąć wszystkich do tego pliku? Ponieważ mam usługę i formularz ich używania, a to, co dzieje się, gdy formularz aktualizuje wartość, tworzy ten plik user.config, a następnie usługa nadal pobiera wartości z pliku app.config: S – JonE

+0

Nie jestem upewnij się, że jesteś w stanie "udostępnić" pojedynczą konfigurację (pojedynczy plik app.config lub w połączeniu z jednym lub większą liczbą plików user.config) między dwiema różnymi aplikacjami. AFAIK nie ma możliwości, aby 'LocalFileSettingsProvider' wiedział, że plik konfiguracyjny, do którego się odnosi, został zaktualizowany przez zewnętrzne źródło. Podejrzewam, że musisz zaimplementować własne wyprowadzenie 'SettingsProvider' (lub może jest coś tam w sieci, która robi to, czego potrzebujesz). – Sepster

+0

Można też eksperymentować z [LocalFileSettingsProvider.GetPropertyValues] (http://msdn.microsoft.com/en-au/library/system.configuration.localfilesettingsprovider.getpropertyvalues.aspx) lub [LocalFileSettingsProvider.Initialize] (http: // msdn.microsoft.com/en-au/library/system.configuration.localfilesettingsprovider.initialize.aspx), aby sprawdzić, czy któreś z tych "odświeże" swoje ustawienia z pamięci podręcznej z odczytanymi świeżymi danymi z połączonych plików app.config/user.config. Wykonanie tego tuż przed uzyskaniem dostępu do ustawienia może po prostu obejść problem: może rozpoznać nowy plik user.config. – Sepster