Comment puis-je enregistrer les paramètres d'application dans une application Windows Forms?

583

Ce que je veux réaliser est très simple: j'ai une application Windows Forms (.NET 3.5) qui utilise un chemin pour lire les informations. Ce chemin peut être modifié par l'utilisateur, en utilisant le formulaire d'options que je fournis.

Maintenant, je veux enregistrer la valeur du chemin d'accès dans un fichier pour une utilisation ultérieure. Ce serait l'un des nombreux paramètres enregistrés dans ce fichier. Ce fichier se trouverait directement dans le dossier de l'application.

Je comprends que trois options sont disponibles:

  • Fichier ConfigurationSettings (appname.exe.config)
  • Enregistrement
  • Fichier XML personnalisé

J'ai lu que le fichier de configuration .NET n'est pas prévu pour y sauvegarder des valeurs. Quant au registre, je voudrais m'en éloigner le plus possible.

Est-ce à dire que je dois utiliser un fichier XML personnalisé pour enregistrer les paramètres de configuration?

Si c'est le cas, je voudrais voir un exemple de code (C #).

J'ai vu d'autres discussions sur ce sujet, mais ce n'est toujours pas clair pour moi.

Alimenté
la source
S'agit-il d'une application .NET WinForms? Si oui, sur quelle version de .NET développez-vous?
Portman
1
Oui, il s'agit d'une application WinForms de la version 3.5 du framework .NET.
Alimenté le
1
avez-vous besoin de sauvegarder des mots de passe ou des valeurs secrètes ?
Nécessite

Réponses:

594

Si vous travaillez avec Visual Studio, il est assez facile d'obtenir des paramètres persistants. Cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions et choisissez Propriétés. Sélectionnez l'onglet Paramètres et cliquez sur l'hyperlien si les paramètres n'existent pas.

Utilisez l'onglet Paramètres pour créer des paramètres d'application. Visual Studio crée les fichiers Settings.settingset Settings.Designer.settingsqui contiennent la classe singleton Settingshéritée d' ApplicationSettingsBase . Vous pouvez accéder à cette classe à partir de votre code pour lire / écrire les paramètres de l'application:

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

Cette technique est applicable à la fois pour la console, les Windows Forms et d'autres types de projets.

Notez que vous devez définir la propriété d' étendue de vos paramètres. Si vous sélectionnez Portée d'application, Settings.Default. <Votre propriété> sera en lecture seule.

Référence: Comment: écrire des paramètres utilisateur lors de l'exécution avec C # - Microsoft Docs

aku
la source
2
si j'ai une solution, cela s'appliquera-t-il à la solution entière ou à chaque projet?
franko_camron
8
@Four: J'ai un projet WinApp .NET 4.0 ici, et mon SomeProperty n'est pas en lecture seule. Settings.Default.SomeProperty = 'value'; Settings.Default.Save();fonctionne comme un charme. Ou est-ce parce que j'ai des paramètres utilisateur?
doekman
4
@Four: Quand j'ai changé un paramètre d'utilisateur à portée d'application et enregistré le fichier, j'ai vu dans le code généré que le setter a disparu. Cela se produit également avec le profil client 4.0 ...
doekman
3
@Four: un excellent lien, bien que votre déclaration selon laquelle le Settings.Default.Save()ne fait rien est incorrecte. Comme @aku l'indique dans la réponse, les paramètres de portée d'application sont en lecture seule: la sauvegarde est inefficace pour eux. Utilisez ce PortableSettingsProvider personnalisé pour enregistrer les paramètres de portée utilisateur dans le fichier app.config situé à l'emplacement de l'exe au lieu de celui du dossier AppData de l'utilisateur. Non, pas généralement bon, mais je l'utilise pendant le développement pour utiliser les mêmes paramètres de compilation en compilation (sans cela, ils vont de nouveaux dossiers utilisateur uniques avec chaque compilation).
minnow
7
À partir de maintenant, avec .NET 3.5, il semble que vous pouvez simplement utiliser Settings.Default.SomeProperty pour attribuer une valeur et obtenir une forte transtypage. De plus, pour gagner du temps (il m'a fallu un certain temps pour comprendre cela), vous devez soit taper Properties.Settings.Default, soit ajouter en utilisant YourProjectNameSpace.Settings en haut de votre fichier. "Paramètres" seul n'est pas défini / trouvé.
eselk
95

Si vous prévoyez d'enregistrer dans un fichier dans le même répertoire que votre exécutable, voici une bonne solution qui utilise le format JSON :

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;
        }
    }
}
Trevor
la source
Oui, remplacez DEFAULT_FILENAME par un chemin absolu si vous souhaitez enregistrer dans un autre répertoire. Je pense qu'il est plus courant d'enregistrer le fichier dans le même répertoire que l'application, ou dans un sous-répertoire, si vous ne les enregistrez pas dans le registre.
Trevor
Oh, peut-être que la meilleure option serait de stocker le fichier de paramètres dans le dossier appdata de l'utilisateur.
Trevor
1
Pas besoin de changer DEFAULT_FILENAME, il suffit d'appeler settings.Save(theFileToSaveTo); Être tout en majuscules DEFAULT_FILENAMEest censé être une constante . Si vous voulez une propriété en lecture-écriture, créez-en une et demandez au constructeur de la définir sur DEFAULT_FILENAME. Ensuite, définissez la valeur d'argument par défaut null, testez-la et utilisez votre propriété comme valeur par défaut. C'est un peu plus de frappe, mais vous donne une interface plus standard.
Jesse Chisholm
10
Vous devrez faire référence System.Web.Extensions.dllsi vous ne l'avez pas déjà fait.
TEK
9
J'ai créé une bibliothèque entière basée sur cette réponse avec de nombreuses améliorations et l'ai rendue disponible dans nuget: github.com/Nucs/JsonSettings
NucS
67

Le registre est un no-go. Vous n'êtes pas sûr que l'utilisateur qui utilise votre application dispose des droits suffisants pour écrire dans le registre.

Vous pouvez utiliser le app.configfichier pour enregistrer les paramètres au niveau de l'application (qui sont les mêmes pour chaque utilisateur qui utilise votre application).

Je stockerais les paramètres spécifiques à l'utilisateur dans un fichier XML, qui serait enregistré dans le stockage isolé ou dans le répertoire SpecialFolder.ApplicationData .

À côté de cela, à partir de .NET 2.0, il est possible de stocker des valeurs dans le app.configfichier.

Frederik Gheysels
la source
8
Utilisez le registre, cependant, si vous souhaitez des paramètres par connexion / utilisateur.
thenonhacker
19
Le registre n'est pas portable
Ko.
10
@thenonhacker: Ou utilisez Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData)
Kenny Mann
4
Le registre d'utilisateurs peut être écrit (de nombreux programmes y écrivent des informations et les autorisations des utilisateurs ne sont jamais un problème). L'avantage de l'utilisation du registre par rapport à l'utilisation des paramètres est que si plusieurs applications partagent le même dossier (par exemple, un programme d'installation et un programme d'application), elles ne partageront pas les mêmes paramètres.
Kesty
3
Le principal inconvénient du Registre est la manière difficile d'exporter / copier des paramètres vers un autre PC. Mais je ne suis pas d'accord avec "Vous n'êtes pas sûr que l'utilisateur qui utilise votre application dispose des droits suffisants pour écrire dans le registre" - Dans HKEY_CURRENT_USER, vous avez toujours des droits pour écrire. Il peut être refusé, mais le système de fichiers peut également être inaccessible pour l'utilisateur actuel (tous les dossiers TEMP possibles, etc.).
i486
20

La ApplicationSettingsclasse ne prend pas en charge l'enregistrement des paramètres dans le fichier app.config . C'est très bien par conception; les applications qui s'exécutent avec un compte d'utilisateur correctement sécurisé (pensez à Vista UAC) n'ont pas accès en écriture au dossier d'installation du programme.

Vous pouvez combattre le système avec la ConfigurationManagerclasse. Mais la solution de contournement triviale consiste à entrer dans le concepteur de paramètres et à modifier la portée du paramètre en utilisateur. Si cela cause des difficultés (par exemple, le paramètre est pertinent pour chaque utilisateur), vous devez placer votre fonctionnalité Options dans un programme distinct afin de pouvoir demander l'invite d'élévation des privilèges. Ou renoncez à utiliser un paramètre.

Hans Passant
la source
Pourriez-vous développer votre dernière phrase? Demander l'élévation pour écrire app.config ou pour écrire une application distincte qui passerait par les folers personnels de tous les utilisateurs, rechercher user.config et les modifier?
CannibalSmith
2
Le programme séparé nécessite un manifeste pour demander l'élévation. Google «asinvoker requireeadministrator» pour trouver la syntaxe appropriée. La modification de user.config n'est ni pratique ni nécessaire.
Hans Passant
18

L'argument Registry / configurationSettings / XML semble toujours très actif. Je les ai tous utilisés, au fur et à mesure que la technologie a progressé, mais mon préféré est basé sur le système de Threed combiné avec le stockage isolé .

L'exemple suivant permet le stockage d'un objet nommé propriétés dans un fichier dans un stockage isolé. Tel que:

AppSettings.Save(myobject, "Prop1,Prop2", "myFile.jsn");

Les propriétés peuvent être récupérées en utilisant:

AppSettings.Load(myobject, "myFile.jsn");

Il ne s'agit que d'un échantillon, ne suggérant pas les meilleures pratiques.

internal static class AppSettings
{
    internal static void Save(object src, string targ, string fileName)
    {
        Dictionary<string, object> items = new Dictionary<string, object>();
        Type type = src.GetType();

        string[] paramList = targ.Split(new char[] { ',' });
        foreach (string paramName in paramList)
            items.Add(paramName, type.GetProperty(paramName.Trim()).GetValue(src, null));

        try
        {
            // GetUserStoreForApplication doesn't work - can't identify.
            // application unless published by ClickOnce or Silverlight
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForAssembly();
            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Create, storage))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.Write((new JavaScriptSerializer()).Serialize(items));
            }

        }
        catch (Exception) { }   // If fails - just don't use preferences
    }

    internal static void Load(object tar, string fileName)
    {
        Dictionary<string, object> items = new Dictionary<string, object>();
        Type type = tar.GetType();

        try
        {
            // GetUserStoreForApplication doesn't work - can't identify
            // application unless published by ClickOnce or Silverlight
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForAssembly();
            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Open, storage))
            using (StreamReader reader = new StreamReader(stream))
            {
                items = (new JavaScriptSerializer()).Deserialize<Dictionary<string, object>>(reader.ReadToEnd());
            }
        }
        catch (Exception) { return; }   // If fails - just don't use preferences.

        foreach (KeyValuePair<string, object> obj in items)
        {
            try
            {
                tar.GetType().GetProperty(obj.Key).SetValue(tar, obj.Value, null);
            }
            catch (Exception) { }
        }
    }
}
Boczek
la source
1
Ou mieux encore; utiliser DataContractJsonSerializer
Boczek
16

Je voulais partager une bibliothèque que j'ai construite pour cela. C'est une petite bibliothèque, mais une grande amélioration (à mon humble avis) par rapport aux fichiers .settings.

La bibliothèque s'appelle Jot (GitHub) . Voici un vieil article de The Code Project que j'ai écrit à ce sujet.

Voici comment l'utiliser pour garder une trace de la taille et de l'emplacement d'une fenêtre:

public MainWindow()
{
    InitializeComponent();

    _stateTracker.Configure(this)
        .IdentifyAs("MyMainWindow")
        .AddProperties(nameof(Height), nameof(Width), nameof(Left), nameof(Top), nameof(WindowState))
        .RegisterPersistTrigger(nameof(Closed))
        .Apply();
}

L'avantage par rapport aux fichiers .settings: il y a beaucoup moins de code et il est beaucoup moins sujet aux erreurs car vous n'avez besoin de mentionner chaque propriété qu'une seule fois .

Avec un fichier de paramètres, vous devez mentionner chaque propriété cinq fois: une fois lorsque vous créez explicitement la propriété et quatre fois supplémentaires dans le code qui copie les valeurs d'avant en arrière.

Le stockage, la sérialisation, etc. sont entièrement configurables. Lorsque les objets cibles sont créés par un IoC conteneur , vous pouvez [le raccorder] [] afin qu'il applique automatiquement le suivi à tous les objets qu'il résout, de sorte que tout ce que vous devez faire pour rendre une propriété persistante est de gifler un [Trackable] attribuer dessus.

Il est hautement configurable et vous pouvez configurer: - lorsque les données sont persistantes et appliquées globalement ou pour chaque objet suivi - comment elles sont sérialisées - où elles sont stockées (par exemple fichier, base de données, en ligne, stockage isolé, registre) - règles qui peuvent annuler l'application / données persistantes pour une propriété

Croyez-moi, la bibliothèque est de premier ordre!

anakic
la source
14

Un moyen simple consiste à utiliser un objet de données de configuration, à l'enregistrer en tant que fichier XML avec le nom de l'application dans le dossier local et au démarrage à le relire.

Voici un exemple pour stocker la position et la taille d'un formulaire.

L'objet de données de configuration est fortement typé et facile à utiliser:

[Serializable()]
public class CConfigDO
{
    private System.Drawing.Point m_oStartPos;
    private System.Drawing.Size m_oStartSize;

    public System.Drawing.Point StartPos
    {
        get { return m_oStartPos; }
        set { m_oStartPos = value; }
    }

    public System.Drawing.Size StartSize
    {
        get { return m_oStartSize; }
        set { m_oStartSize = value; }
    }
}

Une classe gestionnaire pour la sauvegarde et le chargement:

public class CConfigMng
{
    private string m_sConfigFileName = System.IO.Path.GetFileNameWithoutExtension(System.Windows.Forms.Application.ExecutablePath) + ".xml";
    private CConfigDO m_oConfig = new CConfigDO();

    public CConfigDO Config
    {
        get { return m_oConfig; }
        set { m_oConfig = value; }
    }

    // Load configuration file
    public void LoadConfig()
    {
        if (System.IO.File.Exists(m_sConfigFileName))
        {
            System.IO.StreamReader srReader = System.IO.File.OpenText(m_sConfigFileName);
            Type tType = m_oConfig.GetType();
            System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType);
            object oData = xsSerializer.Deserialize(srReader);
            m_oConfig = (CConfigDO)oData;
            srReader.Close();
        }
    }

    // Save configuration file
    public void SaveConfig()
    {
        System.IO.StreamWriter swWriter = System.IO.File.CreateText(m_sConfigFileName);
        Type tType = m_oConfig.GetType();
        if (tType.IsSerializable)
        {
            System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType);
            xsSerializer.Serialize(swWriter, m_oConfig);
            swWriter.Close();
        }
    }
}

Vous pouvez maintenant créer une instance et l'utiliser dans les événements de chargement et de fermeture de votre formulaire:

    private CConfigMng oConfigMng = new CConfigMng();

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load configuration
        oConfigMng.LoadConfig();
        if (oConfigMng.Config.StartPos.X != 0 || oConfigMng.Config.StartPos.Y != 0)
        {
            Location = oConfigMng.Config.StartPos;
            Size = oConfigMng.Config.StartSize;
        }
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // Save configuration
        oConfigMng.Config.StartPos = Location;
        oConfigMng.Config.StartSize = Size;
        oConfigMng.SaveConfig();
    }

Et le fichier XML produit est également lisible:

<?xml version="1.0" encoding="utf-8"?>
<CConfigDO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <StartPos>
    <X>70</X>
    <Y>278</Y>
  </StartPos>
  <StartSize>
    <Width>253</Width>
    <Height>229</Height>
  </StartSize>
</CConfigDO>
Dieter Meemken
la source
1
Je travaille très bien en développement, mais lorsque je déploie l'application, l'utilisateur moyen n'a pas accès au c:\program files\my applicationdossier, donc la sauvegarde des paramètres génère une erreur. Je cherche plutôt à enregistrer le fichier xml dans AppData, mais je me demandais simplement s'il y avait un moyen évident de contourner ce problème, car cette approche semble avoir fonctionné pour vous.
Philip Stratford
@PhilipStratford Puisqu'il ne s'agit que d'un fichier normal, vous pouvez l'enregistrer n'importe où. Trouvez simplement un endroit avec un accès en écriture.
Dieter Meemken
@PhilipStratford Le dossier AppData peut être une option pour vous, voir C # obtenir le chemin de% AppData% , comme mentionné par kite .
Dieter Meemken
Merci, j'ai déjà implémenté cela, en enregistrant le fichier xml dans le dossier AppDate. Je me demandais simplement s'il y avait un moyen facile de l'enregistrer dans le dossier de l'application selon votre exemple, car je supposais que vous l'aviez fait fonctionner. Ne vous inquiétez pas, le dossier AppData est probablement un meilleur emplacement de toute façon!
Philip Stratford
5

D'autres options, au lieu d'utiliser un fichier XML personnalisé, nous pouvons utiliser un format de fichier plus convivial: fichier JSON ou YAML.

  • Si vous utilisez .NET 4.0 dynamic, cette bibliothèque est vraiment facile à utiliser (sérialiser, désérialiser, prendre en charge les objets imbriqués et ordonner la sortie comme vous le souhaitez + fusionner plusieurs paramètres en un seul) JsonConfig (l'utilisation est équivalente à ApplicationSettingsBase)
  • Pour la bibliothèque de configuration .NET YAML ... Je n'en ai pas trouvé qui soit aussi facile à utiliser que JsonConfig

Vous pouvez stocker votre fichier de paramètres dans plusieurs dossiers spéciaux (pour tous les utilisateurs et par utilisateur) comme indiqué ici Environment.SpecialFolder Enumeration et plusieurs fichiers (par défaut en lecture seule, par rôle, par utilisateur, etc.)

Si vous choisissez d'utiliser plusieurs paramètres, vous pouvez fusionner ces paramètres: par exemple, fusionner les paramètres par défaut + BasicUser + AdminUser. Vous pouvez utiliser vos propres règles: la dernière remplace la valeur, etc.

cerf-volant
la source
4

"Cela signifie-t-il que je devrais utiliser un fichier XML personnalisé pour enregistrer les paramètres de configuration?" Non pas forcément. Nous utilisons SharpConfig pour de telles opérations.

Par exemple, si un fichier de configuration est comme ça

[General]
# a comment
SomeString = Hello World!
SomeInteger = 10 # an inline comment

Nous pouvons récupérer des valeurs comme celle-ci

var config = Configuration.LoadFromFile("sample.cfg");
var section = config["General"];

string someString = section["SomeString"].StringValue;
int someInteger = section["SomeInteger"].IntValue;

Il est compatible avec .NET 2.0 et supérieur. Nous pouvons créer des fichiers de configuration à la volée et nous pouvons les enregistrer plus tard.

Source: http://sharpconfig.net/
GitHub: https://github.com/cemdervis/SharpConfig

Turker Tunali
la source
3

Pour autant que je sache, .NET prend en charge les paramètres persistants à l'aide de la fonction de paramètres d'application intégrée:

La fonction Paramètres d'application de Windows Forms facilite la création, le stockage et la gestion des préférences personnalisées d'application et d'utilisateur sur l'ordinateur client. Avec les paramètres d'application Windows Forms, vous pouvez stocker non seulement les données d'application telles que les chaînes de connexion à la base de données, mais également les données spécifiques à l'utilisateur, telles que les préférences d'application utilisateur. À l'aide de Visual Studio ou d'un code managé personnalisé, vous pouvez créer de nouveaux paramètres, les lire et les écrire sur le disque, les lier aux propriétés de vos formulaires et valider les données de paramètres avant le chargement et l'enregistrement. - http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

Jacob
la source
2
Pas vrai .. voir la réponse d'Aku ci-dessus. son possible en utilisant Paramètres et ApplicationSettingsBase
Gishu
2

Parfois, vous voulez vous débarrasser de ces paramètres conservés dans le fichier web.config ou app.config traditionnel. Vous voulez un contrôle plus fin sur le déploiement de vos entrées de paramètres et la conception de données séparées. Ou l'exigence est d'activer l'ajout de nouvelles entrées lors de l'exécution.

Je peux imaginer deux bonnes options:

  • La version fortement typée et
  • La version orientée objet.

L'avantage de la version fortement typée réside dans les noms et valeurs des paramètres fortement typés. Il n'y a aucun risque de mélanger des noms ou des types de données. L'inconvénient est que plus de paramètres doivent être codés, ne peuvent pas être ajoutés au moment de l'exécution.

Avec la version orientée objet, l'avantage est que de nouveaux paramètres peuvent être ajoutés au moment de l'exécution. Mais vous n'avez pas de noms et de valeurs fortement saisis. Doit être prudent avec les identificateurs de chaîne. Doit connaître le type de données enregistré précédemment lors de l'obtention d'une valeur.

Vous pouvez trouver le code des deux implémentations entièrement fonctionnelles ICI .

user3130351
la source
2

Oui, il est possible d'enregistrer la configuration - mais cela dépend à peu près de la façon dont vous choisissez de le faire. Permettez-moi de décrire les différences techniques afin que vous puissiez comprendre les options dont vous disposez:

Tout d'abord, vous devez distinguer si vous souhaitez utiliser applicationSettings ou AppSettings dans votre fichier *.exe.config(aka App.configdans Visual Studio) - il existe des différences fondamentales, décrites ici .

Les deux offrent différentes façons d'enregistrer les modifications:

  • Les AppSettings vous permettent de lire et d'écrire directement dans le fichier de configuration (via config.Save(ConfigurationSaveMode.Modified);, où config est défini comme config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);).

  • Les paramètres d'application permettent de lire, mais si vous écrivez des modifications (via Properties.Settings.Default.Save();), elles seront écrites par utilisateur, stockées dans un endroit spécial (par exemple C:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0). Comme Hans Passant l'a mentionné dans sa réponse, cela est dû au fait qu'un utilisateur a généralement des droits restreints sur Program Files et ne peut pas y écrire sans invoquer l'invite UAC. Un inconvénient est que si vous ajoutez des clés de configuration à l'avenir, vous devez les synchroniser avec chaque profil utilisateur.

Remarque: Comme mentionné dans la question, il existe une troisième option: si vous traitez le fichier de configuration comme un document XML, vous pouvez le charger, le modifier et l'enregistrer en utilisant la System.Xml.Linq.XDocumentclasse. Il n'est pas nécessaire d'utiliser un fichier XML personnalisé, vous pouvez lire le fichier de configuration existant; pour interroger des éléments, vous pouvez même utiliser des requêtes Linq. J'ai donné un exemple ici , consultez la fonction GetApplicationSettinglà-bas dans la réponse.

Si vous avez besoin d'un chiffrement pour protéger vos valeurs, consultez cette réponse.

Mat
la source
Merci pour cette excellente réponse.
NoChance
2
@NoChance - Je vous en prie, heureux d'avoir pu vous aider!
Matt
Agréable! Enfin compris tout cela 😂😂😂
Momoro
1
@Momoro - bon à entendre! ;-)
Matt
1
public static class SettingsExtensions
{
    public static bool TryGetValue<T>(this Settings settings, string key, out T value)
    {
        if (settings.Properties[key] != null)
        {
            value = (T) settings[key];
            return true;
        }

        value = default(T);
        return false;
    }

    public static bool ContainsKey(this Settings settings, string key)
    {
        return settings.Properties[key] != null;
    }

    public static void SetValue<T>(this Settings settings, string key, T value)
    {
        if (settings.Properties[key] == null)
        {
            var p = new SettingsProperty(key)
            {
                PropertyType = typeof(T),
                Provider = settings.Providers["LocalFileSettingsProvider"],
                SerializeAs = SettingsSerializeAs.Xml
            };
            p.Attributes.Add(typeof(UserScopedSettingAttribute), new UserScopedSettingAttribute());
            var v = new SettingsPropertyValue(p);
            settings.Properties.Add(p);
            settings.Reload();
        }
        settings[key] = value;
        settings.Save();
    }
}
Paul - Soura Tech LLC
la source