Domanda

È possibile accedere ai valori da applicationSettings sezione di caricamento di una app.file di configurazione?

Ho trovato un esempio Come faccio a recuperare appSettings, ma non riesco a scoprire come accedere applicationSettings in questo modo.

È stato utile?

Soluzione

Il applicationSettings sono readonly durante il runtime.È possibile impostare/modificare tramite un editor di testo in app.file di configurazione direttamente, ma si consiglia di aprire le proprietà del progetto in Visual Studio e selezionare la scheda "Impostazioni".È importante impostare il giusto campo di applicazione:

  • Se le impostazioni vengono applicate a tutta l'applicazione (per tutti gli utenti), selezionare "Applicazioni" come campo di applicazione.
  • Se ogni utente dovrebbe avere impostazioni individuali (associato al profilo utente), quindi selezionare "Utente"

Per esempio, se si crea myOwnSetting nel progetto WindowsFormsTestApplication1 come segue:

myOwnSetting

aggiungere i seguenti per l'applicazione.file di configurazione:

<configuration>
    <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <section name="WindowsFormsTestApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
    </configSections>
    <applicationSettings>
        <WindowsFormsTestApplication1.Properties.Settings>
            <setting name="myOwnSetting" serializeAs="String">
                <value>Hi there!</value>
            </setting>
        </WindowsFormsTestApplication1.Properties.Settings>
    </applicationSettings>
</configuration>

Visual Studio crea il codice C# per accedere a questa impostazione automaticamente (questo è il motivo per cui si dovrebbe fare nelle proprietà del progetto e non tramite editor di testo) - dopo aver salvato le modifiche, dall'interno di uno stesso spazio dei nomi è possibile leggere il valore in applicazione facilmente tramite il seguente codice:

var currentValue = Properties.Settings.Default.myOwnSetting;

Data la applicationSettings nell'elenco di sopra, questo permetterebbe di recuperare la stringa "Ciao!" per la variabile currentValue.

Nota che se hai creato myOwnSetting per il "Utente" ambito, poi è memorizzato in una sezione denominata <userSettings> invece di <applicationSettings>, ma è ancora possibile accedere con la riga di codice precedente.

Un'altra differenza di ambito di "Utente" impostazioni è che si dispone di accesso in lettura-scrittura, cioèè consentito effettuare le seguenti operazioni:

        Properties.Settings.Default.myUserSetting = "Something else";
        Properties.Settings.Default.Save();

Se si tenta lo stesso con la "Applicazione" impostazioni dell'ambito myOwnSetting, sarebbe risultato in un errore di compilazione, dice che è di sola lettura.

Se si ri-avvia l'applicazione, si noterà che myUserSetting ha cambiato il valore di "Qualcos'altro" - ma il valore precedente è ancora in app.config.Perché è così?La ragione è che esso è considerato come valore di default - e come ho detto prima, l ' "Utente" ambito è associato al profilo utente.Come conseguenza, il valore di "Qualcos'altro" è memorizzato in

C:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0

in un file di nome User.config, che si presenta come segue:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <WindowsFormsTestApplication1.Properties.Settings>
            <setting name="myUserSetting" serializeAs="String">
                <value>Something else</value>
            </setting>
        </WindowsFormsTestApplication1.Properties.Settings>
    </userSettings>
</configuration>

Non si può proprio dire che il percorso in quanto è creato automaticamente con il .NET Framework, e si avrà un aspetto diverso sul vostro PC.Ma si può vedere che la USERID è l'ID utente di Windows del vostro utente corrente, FIRMNAME è parte dell'assemblea informazioni specificate, e l'assemblea, il nome e la versione è utilizzato anche nel percorso.


Nota:

  • Il <sectionGroup> con <section> la dichiarazione è obbligatoria e il suo nome attributo deve coincidere con lo spazio dei nomi.Lo spazio dei nomi deve comparire una sola volta nella configurazione, e c'è solo una applicationSettings sezione consentito.

  • Come si può vedere nel file di configurazione, lo spazio dei nomi è esplicitamente menzionato c' (WindowsFormsTestApplication1.Properties.Settings).Di conseguenza, se si desidera accedere alle impostazioni dal codice non essere nello stesso spazio dei nomi potrebbe essere necessario utilizzare un riferimento completo.Detto questo, occorre fare attenzione se si copia l'intero <applicationSettings>...</applicationSettings> sezione da un'applicazione di configurazione per un altro, potrebbe essere necessario modificare lo spazio dei nomi nel target config in seguito.

  • Se si utilizza la Progettazione Impostazioni (Impostazioni scheda di progetto), verrà creato un file di nome Settings.Settings (insieme con Settings.Designer.cs per accedere al sessings tramite codice C#) nella sezione Proprietà del tuo progetto.Questa è una copia delle impostazioni come verrà memorizzato nel vostro Web.config o App.config file (a seconda del tipo di progetto, solo per l'ambito di applicazione impostazioni - ambito di utente sono memorizzate le impostazioni in base al profilo utente).È possibile creare ulteriori *.settings i file e li uso (come è descritto qui).

  • Se sei non utilizzando le impostazioni di design, o se si sta utilizzando uno strumento come LinqPad, potrebbe essere necessario utilizzare un approccio diverso.Considerate questo:

    internal static string GetApplicationSetting(string key, 
            string nameSpace="Properties.Settings")
    {
        string xValue=null;
        try 
        {
            string path = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
            XDocument doc = XDocument.Load(path);
            var xPathStr= string.IsNullOrEmpty(nameSpace) 
                            ? "//applicationSettings" 
                            : $"//applicationSettings/{nameSpace}";
            var settings=doc.XPathSelectElement(xPathStr).Elements().Where(
                                w => w.Name=="setting" 
                                    && w.HasAttributes 
                                    && w.Attribute("serializeAs").Value=="String"
                                );
            var setting=settings.Where(f => f.HasAttributes 
                                            && f.Attribute("name").Value==key).Elements();
            xValue=setting.FirstOrDefault().Value;
        }
        catch {}
        return xValue;
    }
    

    Si può leggere di tipo stringa applicationSettings trattando la configurazione come XDocument.L'esempio dato è limitato al tipo di stringa e si può ottenere l'impostazione dell'app.config esempio di cui sopra come segue:
    var value=GetApplicationSetting("myOwnSetting", "WindowsFormsTestApplication1.Properties.Settings");
    Allo stesso modo, è possibile creare una funzione simile GetUserSetting per impostazione predefinita <userSettings> sezione:Basta copiare e incollare il codice di cui sopra, rinominare il nome della funzione e sostituire applicationSettings nel xPathStr da userSettings.

  • C'è un metodo di aggiornamento, disponibile per le impostazioni dell'utente, che è descritto qui.Maggiori dettagli circa la posizione in cui le impostazioni utente vengono memorizzati possono essere trovati c'.

  • Il <appSettings> la sezione di configurazione funziona in modo diverso, in quanto non distinguere "Utente" e "Applicazione" ambito di applicazione e non il supporto di diversi tipi di dati, solo stringhe.Tuttavia, è possibile facilmente leggere e scrivere la configurazione di chiavi e valori.Se ti interessa il codice, lo si può trovare qui (su stackoverflow):
    come leggere/scrivere le impostazioni di configurazione di appSettings

  • Se non siete sicuri se si dovrebbe utilizzare AppSettings o applicationSettings, poi leggere questo prima di decidere.

Altri suggerimenti

Come hai creato le impostazioni? Utilizzando le impostazioni progettista VS? Se quindi dovrebbe crearti una classe fortemente tipizzato per loro l'accesso con. Questo di solito è accessibile tramite Properties.Settings.Default.SettingName

Credo che si preferisce utilizzare i ApplicationSettings piuttosto che appSettings, ma le impostazioni delle applicazioni sono di sola lettura in fase di esecuzione, cioè non è possibile crearli dal codice, ma è possibile creare e aggiungere appsettings a runtime credo. ho fatto una domanda circa la differenza

è possibile trovare ulteriori informazioni da MSDN

Si potrebbe caricare il file di configurazione in XmlDocument e retrive le ApplicationSettings     dall'oggetto dom.     Ecco ad esempio che ho trovato per caricare il file di configurazione in oggetto dom:

//retrive the current assembly directory
private static string AssemblyDirectory()
{
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
}



//return the value from aplicationSetting according to the given key
//appSettingSection is the your configuration section as declare in your web.config
public static string GetApplicationSettingValue(string appSettingSection,string key)
{
   //get web.config path
   string configPath  = new System.IO.DirectoryInfo(AssemblyDirectory()).Parent.FullName + "\\web.config";

    System.IO.FileInfo FileInfo = new System.IO.FileInfo(configPath);
    if (!FileInfo.Exists)
    {
        throw new Exception("Missing config file");
    }

    //load config file into xml document
    var XmlConfig = new System.Xml.XmlDocument();
    XmlConfig.Load(FileInfo.FullName);


     //override xml document and return the value of the key under applicationSettings
     foreach (System.Xml.XmlNode node in XmlConfig["configuration"]  ["applicationSettings"]appSettingSection])
     {
                    if (node.Name == "setting")
                    {
                        if (node.Attributes.GetNamedItem("name").Value == key)
                        {
                            return node.FirstChild.InnerXml.ToString();
                        }
                   }
     }
   return "";
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top