2010-09-03 6 views
13

Ich bin auf der Suche nach einer Möglichkeit, Einstellungen für Anwendungen oder Maschinen zu speichern, auf die zur Laufzeit mit Application Settings geschrieben werden kann. Benutzereinstellungen ermöglichen das Lesen/Schreiben, die Anwendungseinstellungen jedoch nicht. Ich habe Benutzereinstellungen verwendet, um Einstellungen wie diese zur Laufzeit zu speichern, aber dies hat sich aus folgenden Gründen als unpraktisch erwiesen:Wie kann ich app.config Einstellungen zur Laufzeit ohne Benutzereinstellungen lesen/schreiben?

  • Alle Benutzer der Maschine müssen Einstellungen teilen.
  • In Supportanrufen (besonders in Krisensituationen) ist es schwierig, Benutzern/Mitarbeitern zu erklären, wo diese Einstellungen manuell gefunden und geändert werden können (appdata ist unter anderem ein versteckter Ordner).
  • Neue Versionen der App müssen vorherige Einstellungen verwenden (Benutzereinstellungen scheinen mit neuen Versionen weggeblasen zu werden).
  • Es ist üblich, dass unsere Mitarbeiter die Anwendung in einen neuen Ordner kopieren, der auch die Benutzereinstellungen zurücksetzt.
  • Unsere Firmencomputer werden sowieso nur von einem Benutzer verwendet, so dass benutzerspezifische Einstellungen normalerweise nicht benötigt werden.

    Ansonsten mag ich es sehr, die Anwendungseinstellungen zu verwenden und möchte sie weiterhin verwenden, wenn möglich. Es wäre ideal, wenn die Einstellungen im Ordner des gleichen Ordners wie der EXE (wie gute alte Ini-Dateien) gespeichert werden könnten.

    HINWEIS: Dies ist eine WPF-Anwendung und keine ASP.net-Webanwendung, also keine web.config.

    +0

    Speichern von beschreibbaren Einstellungen im selben Verzeichnis wie die exe ist eine schlechte Idee - auf Vista/Win7 erfordert diese Admin schreibt und wird Auslöser UAC und verursachen, dass Ihre App erhöht ausgeführt wird. Besser, App-Einstellungen woanders zu speichern. – Andy

    +0

    @Andy Das scheint mir nicht richtig. Ich habe viele Programme geschrieben, die in xml-Dateien im selben Verzeichnis wie die EXE schreiben, ohne UAC auszulösen. –

    Antwort

    9

    Nun, ich wollte noch nicht die Anwendungseinstellungen zur Laufzeit ändern (das ist, wofür ich die Benutzereinstellungen verwende), aber was ich tun konnte, ist, die Programmeinstellungen zur Installationszeit zu schreiben. Ich stelle mir vor, dass ein ähnlicher Ansatz zur Laufzeit funktionieren könnte. Sie können es ausprobieren, da es keine anderen ATM-Lösungen gibt.

    exePath = Path.Combine(exePath, "MyApp.exe"); 
        Configuration config = ConfigurationManager.OpenExeConfiguration(exePath); 
        var setting = config.AppSettings.Settings[SettingKey]; 
        if (setting != null) 
        { 
         setting.Value = newValue; 
        } 
        else 
        { 
         config.AppSettings.Settings.Add(SettingKey, newValue); 
        } 
    
        config.Save(); 
    

    Hoffe, dass hilft!

    3

    WPF-Anwendungen sind in der Lage nur die app.config-Datei zuzugreifen, wie WinForms der

    ConfigurationManager.OpenExeConfiguration() 
    

    Methode apps durch. Der Trick besteht darin, die Werte, auf die Sie zugreifen möchten, im AppSettings-Tag Ihrer App.config-Datei (auch in WPF-Anwendungen verfügbar) zu haben.

    Der Trick, um all dies zu den folgenden Methoden aufrufen stellen Sie sicher, wenn Sie Ihre Eigenschaften fertig sind modifizieren:

    MyConfig.Save(ConfigurationSaveMode.Modified) 
    ConfigurationManager.RefreshSection("appSettings") 
    

    ich ein komplettes schrieb „wie man“ auf dieses eine kleine Weile zurück, dass erklärt alles here.

    +0

    Das funktioniert nicht, wenn der Benutzer nicht über die richtigen UAC-Berechtigungen verfügt. – JWiley

    +0

    @JWiley Guter Punkt. Ich nehme an, die andere Annahme ist, dass die Anwendung an einem Ort installiert wird, wo man diese Datei ändern kann. –

    6

    Dies ist die Methode, die Sie Einträge in den <AppSettings> ändern kann:

    internal static bool SetSetting(string Key, string Value) 
        { 
         bool result = false; 
         try 
         { 
          System.Configuration.Configuration config = 
           ConfigurationManager.OpenExeConfiguration(
                ConfigurationUserLevel.None); 
    
          config.AppSettings.Settings.Remove(Key); 
          var kvElem= new KeyValueConfigurationElement(Key, Value); 
          config.AppSettings.Settings.Add(kvElem); 
    
          // Save the configuration file. 
          config.Save(ConfigurationSaveMode.Modified); 
    
          // Force a reload of a changed section. 
          ConfigurationManager.RefreshSection("appSettings");     
    
          result = true; 
         } 
         finally 
         { } 
         return result; 
        } // function 
    

    Hinweis, dass ich finde es habe erforderlich ist, den Abschnitt appSettings nach dem Update zu aktualisieren.

    Die Funktion entfernt einen Schlüssel, bevor er hinzugefügt wird, um doppelte Einträge zu vermeiden. Dies funktioniert auch, wenn der Schlüssel vorher nicht existiert. Wenn ein Fehler vorliegt, wird false zurückgegeben, bei Erfolg true. Die Methode Einstellungen zu lesen ist trivial und nur der Vollständigkeit halber aufgeführt:

    internal static string GetSetting(string Key) 
        { 
         string result = null; 
         try 
         { 
          result = ConfigurationManager.AppSettings[Key]; 
         } 
         finally 
         { } 
         return result; 
        } // function 
    

    Hinweis, dass ich es von einem versuchen umgeben haben ... schließlich Blockfehler zu unterdrücken. Wenn Fehler auftreten, gibt GetSetting einfach null zurück, während SetSetting false zurückgibt. Das erleichtert die Handhabung, aber wenn Sie die Ausnahmen benötigen, können Sie noch hinzufügen

     catch (Exception) { throw; } 
    

    die Ausnahme zu werfen bis zu dem Anrufer. Oder für das Debuggen könnte man hinzufügen:

     #if DEBUG 
         catch (Exception ex) { 
           System.Diagnostics.Debug.WriteLine(ex.ToString()); 
         } 
         #endif 
    

    , die die Ausnahme in den Output Fenster von Visual Studio zeigen, wenn Sie die „Debug“ Konfiguration ausgewählt haben, wird aber mit dem Code weiter.


    Hinweis (Querverweis auf ein ähnliches Thema):

    • Der application Abschnitt ist anders, da es zwischen "User" und "Application" scope unterscheidet und es unterstützt verschiedene Datentypen, nicht nur Strings. Wenn Sie wissen möchten, wie Sie application umgehen kann, können Sie es hier (auf Stackoverflow):
      How to access applicationSettings

    • Wenn Sie unsicher sind, ob Sie AppSettings oder applicationSettings verwenden sollten, dann read this bevor Sie sich entscheiden es.

    • Wenn Sie die Warnung 'ConfigurationSettings.AppSettings' is obsolete begegnen, dann this hint can help you.