654 Stimmen

Wie kann ich Anwendungseinstellungen in einer Windows Forms-Anwendung speichern?

Was ich erreichen möchte, ist sehr einfach: Ich habe eine Windows Forms (.NET 3.5) Anwendung, die einen Pfad zum Lesen von Informationen verwendet. Dieser Pfad kann vom Benutzer geändert werden, indem er das von mir bereitgestellte Optionsformular verwendet.

Nun möchte ich den Pfadwert zur späteren Verwendung in einer Datei speichern. Dies wäre eine der vielen Einstellungen, die in dieser Datei gespeichert werden. Diese Datei würde sich direkt im Anwendungsordner befinden.

Soweit ich weiß, gibt es drei Möglichkeiten:

  • KonfigurationsEinstellungsdatei (appname.exe.config)
  • Registry
  • Benutzerdefinierte XML-Datei

Ich habe gelesen, dass die .NET-Konfigurationsdatei nicht dafür vorgesehen ist, Werte in ihr zu speichern. Was die Registrierung betrifft, möchte ich so weit wie möglich davon wegkommen.

Bedeutet dies, dass ich eine benutzerdefinierte XML-Datei verwenden sollte, um die Konfigurationseinstellungen zu speichern?

Wenn ja, würde ich gerne ein Codebeispiel dafür sehen (C#).

Ich habe andere Diskussionen zu diesem Thema gesehen, aber es ist mir immer noch nicht klar.

665voto

aku Punkte 118808

Wenn Sie mit Visual Studio arbeiten, ist es ziemlich einfach, persistente Einstellungen zu erhalten. Klicken Sie mit der rechten Maustaste auf das Projekt im Projektmappen-Explorer und wählen Sie Eigenschaften. Wählen Sie die Registerkarte Einstellungen und klicken Sie auf den Hyperlink, wenn die Einstellungen nicht vorhanden sind.

Verwenden Sie die Registerkarte Einstellungen, um Anwendungseinstellungen zu erstellen. Visual Studio erstellt die Dateien Settings.settings y Settings.Designer.settings die die Singleton-Klasse enthalten Settings geerbt von ApplicationSettingsBase . Sie können von Ihrem Code aus auf diese Klasse zugreifen, um Anwendungseinstellungen zu lesen/schreiben:

Properties.Settings.Default["SomeProperty"] = "Some Value";
Properties.Settings.Default.Save(); // Saves settings in application configuration file

Diese Technik ist sowohl für Konsolen-, Windows Forms- als auch für andere Projekttypen anwendbar.

Beachten Sie, dass Sie die Option Umfang Eigenschaft Ihrer Einstellungen. Wenn Sie Anwendungsbereich wählen, wird Einstellungen.Standard.<Ihre Eigenschaft> schreibgeschützt sein.

Referenz: Gewusst wie: Schreiben von Benutzereinstellungen zur Laufzeit mit C# - Microsoft Dokumente

104voto

Trevor Punkte 12546

Wenn Sie vorhaben, in einer Datei zu speichern, die sich im selben Verzeichnis wie Ihre ausführbare Datei befindet, finden Sie hier eine gute Lösung, die die JSON Format:

using System;
using System.IO;
using System.Web.Script.Serialization;

namespace MiscConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            MySettings settings = MySettings.Load();
            Console.WriteLine("Current value of 'myInteger': " + settings.myInteger);
            Console.WriteLine("Incrementing 'myInteger'...");
            settings.myInteger++;
            Console.WriteLine("Saving settings...");
            settings.Save();
            Console.WriteLine("Done.");
            Console.ReadKey();
        }

        class MySettings : AppSettings<MySettings>
        {
            public string myString = "Hello World";
            public int myInteger = 1;
        }
    }

    public class AppSettings<T> where T : new()
    {
        private const string DEFAULT_FILENAME = "settings.json";

        public void Save(string fileName = DEFAULT_FILENAME)
        {
            File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this));
        }

        public static void Save(T pSettings, string fileName = DEFAULT_FILENAME)
        {
            File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(pSettings));
        }

        public static T Load(string fileName = DEFAULT_FILENAME)
        {
            T t = new T();
            if(File.Exists(fileName))
                t = (new JavaScriptSerializer()).Deserialize<T>(File.ReadAllText(fileName));
            return t;
        }
    }
}

71voto

Frederik Gheysels Punkte 54908

Die Registrierung ist ein No-Go. Sie sind sich nicht sicher, ob der Benutzer, der Ihre Anwendung verwendet, über ausreichende Rechte verfügt, um in die Registrierung zu schreiben.

Sie können die app.config Datei, um Einstellungen auf Anwendungsebene zu speichern (die für jeden Benutzer, der Ihre Anwendung nutzt, gleich sind).

Ich würde benutzerspezifische Einstellungen in einer XML-Datei speichern, die in Isolierte Lagerung oder in der SpecialFolder.ApplicationData Verzeichnis.

Darüber hinaus ist es ab .NET 2.0 möglich, Werte zurück in die app.config Datei.

21voto

Hans Passant Punkte 894572

El ApplicationSettings Klasse unterstützt nicht das Speichern von Einstellungen in der app.config Datei. Das ist durchaus beabsichtigt; Anwendungen, die mit einem ordnungsgemäß gesicherten Benutzerkonto ausgeführt werden (z. B. Vista UAC), haben keinen Schreibzugriff auf den Installationsordner des Programms.

Sie können das System mit dem ConfigurationManager Klasse. Die triviale Abhilfe besteht darin, in den Einstellungsdesigner zu gehen und den Geltungsbereich der Einstellung in Benutzer zu ändern. Wenn das zu Problemen führt (z. B. wenn die Einstellung für jeden Benutzer relevant ist), sollten Sie die Funktion "Optionen" in ein separates Programm aufnehmen, so dass Sie die Eingabeaufforderung für die Berechtigungserhöhung anfordern können. Oder verzichten Sie auf die Verwendung einer Einstellung.

20voto

Matt Punkte 23047

Ja, es ist möglich, zu speichern die Konfiguration - aber das hängt weitgehend von der Art und Weise ab, wie Sie es tun wollen. Lassen Sie mich die technischen Unterschiede beschreiben, damit Sie die Optionen, die Sie haben, verstehen können:

Zunächst müssen Sie unterscheiden, ob Sie die applicationSettings o AppEinstellungen in Ihrem *.exe.config (alias App.config in Visual Studio) Datei - es gibt grundlegende Unterschiede, wird hier beschrieben .

Beide bieten unterschiedliche Möglichkeiten, Änderungen zu speichern:

  • El AppEinstellungen ermöglichen das Lesen und Schreiben direkt in die Konfigurationsdatei über config.Save(ConfigurationSaveMode.Modified); wobei config definiert ist als:
    config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

  • El applicationSettings zu lesen erlauben, aber wenn Sie Änderungen schreiben (über Properties.Settings.Default.Save(); ) wird sie für jeden Benutzer einzeln geschrieben und an einem speziellen Ort gespeichert (z.B. C:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0 ). Unter Hans Passant erwähnt in seiner Antwort, liegt dies daran, dass ein Benutzer in der Regel eingeschränkte Rechte für die Programmdateien hat und nicht in diese schreiben kann, ohne die UAC-Eingabeaufforderung aufzurufen. Ein Nachteil ist, dass Sie, wenn Sie in Zukunft Konfigurationsschlüssel hinzufügen, diese mit jedem Benutzerprofil synchronisieren müssen.

Aber es gibt noch eine Reihe anderer Möglichkeiten:

  • Seit .NET Core (und .NET 5 und 6) ist ein 3. Option ist die appsettings.json Datei, die die Konfigurationsabstraktion von Microsoft verwendet. Aber normalerweise benutzt WinForms sie nicht, deshalb erwähne ich sie nur der Vollständigkeit halber. Wie auch immer, hier sind einige Referenzen wie man lesen y schreiben. die Werte. Alternativ können Sie auch Newtonsoft JSON zum Lesen und Schreiben el appsettings.json Datei, aber sie ist nicht darauf beschränkt: Sie können mit dieser Methode auch Ihre eigenen json-Dateien erstellen.

  • Wie in der Frage erwähnt, gibt es eine 4. Möglichkeit: Wenn Sie die Konfigurationsdatei als XML-Dokument, können Sie laden, ändern und speichern, indem Sie die System.Xml.Linq.XDocument Klasse. Es ist nicht erforderlich, eine benutzerdefinierte XML-Datei zu verwenden, Sie können die vorhandene Konfigurationsdatei lesen; für die Abfrage von Elementen können Sie sogar Linq-Abfragen verwenden. Ich habe ein Beispiel gegeben aquí überprüfen Sie die Funktion GetApplicationSetting dort in der Antwort.

  • A 5. Option ist die Speicherung von Einstellungen in der Registrierung. Wie Sie das tun können, wird beschrieben aquí .

  • Und nicht zuletzt gibt es eine 6. Möglichkeit : Sie können die Werte in der Umwelt (Systemumgebung oder Umgebung Ihres Kontos). Geben Sie in den Windows-Einstellungen (das Zahnrad im Windows-Menü) in der Suchleiste "Umgebung" ein und fügen Sie sie dort hinzu oder bearbeiten Sie sie. Um sie zu lesen, verwenden Sie
    var myValue = Environment.GetEnvironmentVariable("MyVariable"); .
    Beachten Sie, dass Ihre Anwendung normalerweise neu gestartet werden muss, um die aktualisierten Umgebungseinstellungen zu erhalten.

Wenn Sie benötigen Verschlüsselung zum Schutz Ihrer Werte, auschecken este Antwort. Sie beschreibt, wie man Microsofts DPAPI verwendet, um Werte verschlüsselt zu speichern.

Und wenn Sie Ihre eigenen Dateien, ob XML oder JSON, unterstützen wollen, könnte es nützlich sein, das Verzeichnis der laufenden Assembly zu kennen:

var assemblyDLL = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyDirectory = System.IO.Path.GetDirectoryName(assemblyDLL.Location);

Sie können verwenden assemblyDirectory als Basisverzeichnis zum Speichern Ihrer Dateien.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X