11

Próbuję utrwalić ustawienia użytkownika do pliku konfiguracyjnego za pomocą menedżera konfiguracji ConfigurationManager.Jak pisać do pliku User.Config za pomocą programu ConfigurationManager?

Chcę, aby zakres tych ustawień był tylko dla użytkownika, ponieważ zmian aplikacji nie można zapisać w systemie Vista/Win 7 bez uprawnień administratora.

To wydaje mi się konfiguracja użytkownika, która wydaje się być zapisana tutaj w Win 7 ([Dysk]: \ Użytkownicy \ [Nazwa użytkownika] \ AppData \ Local \ [Nazwa aplikacji] \ [NazwaZakładu] [hash] \ [ wersja \)

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 

Ilekroć próbuję zapisać zmiany w ogóle do tej konfiguracji otrzymuję ten wyjątek:

InnerException: System.InvalidOperationException 
Message="ConfigurationSection properties cannot be edited when locked." 
Source="System.Configuration" 
StackTrace: 
    at System.Configuration.SectionInformation.VerifyIsEditable() 
    at System.Configuration.MgmtConfigurationRecord.GetConfigDefinitionUpdates(Boolean requireUpdates, ConfigurationSaveMode saveMode, Boolean forceSaveAll, ConfigDefinitionUpdates& definitionUpdates, ArrayList& configSourceUpdates) 

próbowałem dodanie niestandardowego ConfigurationSection do tej konfiguracji. Próbowałem dodać do AppSettingsSection. Ilekroć dzwonię pod numer config.Save(), zgłasza wyjątek powyżej.

Wszelkie pomysły?

Próbowałem używać klasy ApplicationSettingsBase za pomocą Projekt-> Ustawienia projektanta, ale nie wydaje się, że można zapisać niestandardowe typy z tym. Chcę podobną funkcjonalność z możliwością zapisywania niestandardowych typów.

+0

Okazuje się, że możesz użyć niestandardowego dla typów z Projekt-> Projektant ustawień. Nie wyświetlają ich w oknie dialogowym typu, ale jeśli wpiszesz właściwą nazwę/przestrzeń nazw, możesz użyć dowolnego typu. Typ powinien być XmlSerializable lub można go konwertować do/z łańcucha znaków za pomocą TypeConvertera. –

Odpowiedz

8

Trzeba ustawić wartość SectionInformation.AllowExeDefinition na odcinku:

wartość
Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming); 
UserSettings settings; 
if ((settings = (UserSettings)configuration.Sections[GENERAL_USER_SETTINGS]) == null) 
{ 
     settings = new UserSettings(); 
     settings.SectionInformation.AllowExeDefinition = 
       ConfigurationAllowExeDefinition.MachineToLocalUser; 
     configuration.Sections.Add(GENERAL_USER_SETTINGS, settings); 
     configuration.Save(); 
} 

Domyślnie jest ConfigurationAllowExeDefinition.MachineToApplication który pozwala jedynie umieścić sekcję machine.config i app.exe.config.

+0

Spróbuję tego. Próbowałem ustawić właściwość AllowExeDefinition jeden raz i spowodował ten sam wyjątek, który wypalił config.Save(). Skopiuję ten segment kodu i spróbuję ponownie. –

+0

Wygląda na to, że muszę ustawić AllowExeDefinition PRZED dodaniem sekcji i zapisaniem zmian po raz pierwszy. Teraz wszystko działa dobrze. –

+2

z jakiegoś powodu, użycie przeciążenia _ConfigurationManager.OpenExeConfiguration_ z _ConfigurationUserLevel_, nie pozwoliło mi na edycję i zapisanie pliku przez zastrzeżenie, że właściwości _ConfigurationSection nie mogą być edytowane, gdy locked_. tylko wtedy, gdy użyłem przeciążenia _string exepath_, byłem w stanie zapisać konfigurację. – itsho

Powiązane problemy