2009-05-15 4 views
4

Ich habe einige Einstellungen in einer C# -Anwendung mit .NET 3.5 und Visual Studio 2008 Express erstellt. Ich habe eine Reihe von Anwendungsbereichseinstellungen, die ich in der Anwendung ändern könnte - ich kann auf sie über Properties.Settings.Default zugreifen, aber sie sind nur wie erwartet gelesen. Ich möchte diese nicht zu anwenderdefinierten Einstellungen machen, da sie anwendungsweit sein sollten. Ist das möglich, ohne das XML zu laden und selbst zu lesen/schreiben?Kann ich [appname] .exe.config ändern, ohne die XMl manuell lesen/schreiben zu müssen?

Ich habe Beispiele gesehen System.Configuration.ConfigurationManager.OpenExeConfiguration verwenden, aber die Config xml sieht in einem anderen Format, das sein, die ich verwende (das ist von einer älteren Version?)

Dank


bearbeiten

ich arbeitete heraus, dass ich die Werte ändern kann, dies zu tun, aber es scheint wie eine lächerliche Hack.

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
SettingElementCollection settingElements = ((ClientSettingsSection)config.GetSectionGroup("applicationSettings").Sections[0]).Settings; 

SettingElement element = settingElements.Get("SettingName"); 
element.Value.ValueXml.InnerText = "new value"; 

config.Save(ConfigurationSaveMode.Modified, true); 

Antwort

1

OpenExeConfiguration (oder eine der anderen Methoden ConfigurationManager) ist der bevorzugte Eintrittspunkt für die meisten Änderungen an Dateien-Konfiguration. Sobald Sie eine Configuration Instanz haben, sollten Sie den Abschnitt, den Sie ändern möchten, abrufen und nach den Änderungen eine der Methoden ConfigurationManager.Save aufrufen. Es ist jedoch unmöglich, den Abschnitt applicationSettings auf diese Weise abzurufen.

Es gibt keine API zum Ändern von Einstellungen aus dem applicationSettings Abschnitt in Ihrer app.config Datei. Nur benutzerspezifische Einstellungen können auf diese Weise geändert werden.

So ändert tatsächlich diese Einstellungen können nur durch direkte Manipulation der app.config XML-Datei durchgeführt werden.

Einige Verwirrung auftreten, da die indizierte Eigenschaft von Properties.Settings.Default tatsächlich beschreibbar ist. Folgendes ist absolut zulässig:

Properties.Settings.Default["MySetting"] = "New setting value"; 
Properties.Settings.Default.Save(); 

Die Einstellung wird jedoch nicht gespeichert.

+0

Und denken Sie daran, Berechtigungen für die Konfigurationsdatei zu ermöglichen. Erwarten Sie, dass app.exe.config nur für Administratoren schreibbar ist. – Richard

+0

Danke.Welchen Abschnitt würde ich benötigen, um die Einstellungen in Properties.Settings.Default zu erhalten? –

+0

Ich sehe, ich habe deine Frage nicht gut genug gelesen. Die von mir vorgeschlagene Methode ist für allgemeine Änderungen an Konfigurationsdateien. Ich habe meine Antwort aktualisiert, um eine andere (bessere) Möglichkeit zum Ändern der Einstellungen für den Assembly-Bereich anzuzeigen. –

1

Sie können auch die Windows-Registrierung verwenden, um den anwendungsspezifischen Status zu speichern. In der Registrierung befinden sich pro Benutzer und pro Maschine Schlüssel - beide oder beide sind für Sie verfügbar. Einige Benutzer verwenden beispielsweise die Registrierung, um den Standort und die Größe des Anwendungsfensters beim Beenden zu speichern. Wenn die App neu gestartet wird, können Sie das Fenster entsprechend seiner letzten bekannten Größe positionieren und skalieren. Dies ist ein kleines Beispiel für den Zustand, den Sie in der Registrierung speichern können.

es tun Sie verschiedene APIs für die Speicherung und den Abruf verwenden würde. Insbesondere rufen SetValue und GetValue die Microsoft.Win32.RegistryKey-Klasse auf. Es kann Bibliotheken geben, die hilfreich sind, um einen komplexen Zustand der Registrierung zu erhalten. Wenn Sie einfache Fälle (ein paar Strings und Zahlen) haben, dann ist es einfach, es einfach selbst zu machen.

private static string _AppRegyPath = "Software\\Vendor Name\\Application Name"; 

    public Microsoft.Win32.RegistryKey AppCuKey 
    { 
     get 
     { 
      if (_appCuKey == null) 
      { 
       _appCuKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(_AppRegyPath, true); 
       if (_appCuKey == null) 
        _appCuKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(_AppRegyPath); 
      } 
      return _appCuKey; 
     } 
     set { _appCuKey = null; } 
    } 


    private void RetrieveAndApplyState() 
    { 
     string s = (string)AppCuKey.GetValue("textbox1Value"); 
     if (s != null) this.textbox1.Text = s; 

     s = (string)AppCuKey.GetValue("Geometry"); 
     if (!String.IsNullOrEmpty(s)) 
     { 
      int[] p = Array.ConvertAll<string, int>(s.Split(','), 
          new Converter<string, int>((t) => { return Int32.Parse(t); })); 
      if (p != null && p.Length == 4) 
      { 
       this.Bounds = ConstrainToScreen(new System.Drawing.Rectangle(p[0], p[1], p[2], p[3])); 
      } 
     } 
    } 

    private void SaveStateToRegistry() 
    { 
     AppCuKey.SetValue("textbox1Value", this.textbox1.Text); 

     int w = this.Bounds.Width; 
     int h = this.Bounds.Height; 
     int left = this.Location.X; 
     int top = this.Location.Y; 

     AppCuKey.SetValue("Geometry", String.Format("{0},{1},{2},{3}", left, top, w, h); 
    } 


    private System.Drawing.Rectangle ConstrainToScreen(System.Drawing.Rectangle bounds) 
    { 
     Screen screen = Screen.FromRectangle(bounds); 
     System.Drawing.Rectangle workingArea = screen.WorkingArea; 
     int width = Math.Min(bounds.Width, workingArea.Width); 
     int height = Math.Min(bounds.Height, workingArea.Height); 
     // mmm....minimax    
     int left = Math.Min(workingArea.Right - width, Math.Max(bounds.Left, workingArea.Left)); 
     int top = Math.Min(workingArea.Bottom - height, Math.Max(bounds.Top, workingArea.Top)); 
     return new System.Drawing.Rectangle(left, top, width, height); 
    } 

Dieser Code verwendet Microsoft.Win32.Registry.CurrentUser, und so setzt sie und ruft benutzerspezifischen App-Einstellungen. Wenn Sie den maschienenweiten Status festlegen oder abrufen, möchten Sie Microsoft.Win32.Registry.LocalMachine.

Verwandte Themen