Saltar al contenido

¿Cómo recupero ApplicationSettings de un archivo App.config cargado?

Solución:

los Configuraciones de la aplicación están solo lectura durante el tiempo de ejecución. Puede configurarlos / modificarlos directamente a través de un editor de texto en el archivo app.config, pero se recomienda abrir las propiedades del proyecto en Visual Studio y seleccionar la pestaña “Configuración”. Es importante establecer el alcance correcto:

  • Si la configuración se aplica a toda la aplicación (para todos los usuarios), seleccione “Aplicación” como alcance.
  • Si cada usuario debe tener una configuración individual (vinculada al perfil de usuario), seleccione “Usuario”

Por ejemplo, si crea myOwnSetting en tu proyecto WindowsFormsTestApplication1 de la siguiente manera (cambie el alcance a “Solicitud”):

myOwnSetting

agregará lo siguiente al archivo app.config de la aplicación:

<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 código C # para acceder a esta configuración automáticamente (es por eso que debe hacerlo en las propiedades del proyecto y no a través del editor de texto); después de haber guardado los cambios, desde el mismo espacio de nombres puede leer su valor en la aplicación fácilmente. a través del siguiente código:

var currentValue = Properties.Settings.Default.myOwnSetting;

Dado que applicationSettings en la lista anterior, esto recuperaría la cadena “¡Hola!” para la variable currentValue.

Nota que si tu has creado myOwnSetting Para el Alcance del “usuario”, luego se almacena en una sección llamada <userSettings> en lugar de <applicationSettings>, pero aún puede acceder a él con la línea de código de arriba.

Otra diferencia de alcance “Usuario” configuración es que tiene acceso de lectura y escritura, es decir, se le permite hacer lo siguiente:

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

Si intenta lo mismo con la configuración del alcance de “Aplicación” myOwnSetting, se produciría un error en tiempo de compilación que le indicaría que es de solo lectura.

Si reinicia la aplicación, notará que myUserSetting ha cambiado al valor “Algo más”, pero el valor anterior todavía está en app.config. ¿Por qué esto es tan? La razón es que se considera un valor predeterminado y, como dije antes, el alcance de “Usuario” está vinculado al perfil de usuario. Como consecuencia, el valor “Algo más” se almacena en

C:Documents and SettingsUSERIDLocal SettingsApplication DataFIRMNAMEWindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw1.0.0.0

en un archivo llamado User.config, que tiene el siguiente aspecto:

<?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>

No puede saber exactamente la ruta, ya que .NET Framework la crea automáticamente y se verá diferente en su PC. Pero puede ver que USERID es el ID de usuario de Windows de su usuario actual, FIRMNAME es parte de la información de ensamblado que ha especificado y el nombre y la versión del ensamblado también se utilizan en la ruta.


Nota:

  • los <sectionGroup> con <section> La declaración es obligatoria y su atributo de nombre debe coincidir con el espacio de nombres. El espacio de nombres debe aparecer exactamente una vez en la configuración, y solo hay una applicationSettings sección permitida.

  • Como puede ver en el archivo de configuración, el espacio de nombres se menciona explícitamente allí (WindowsFormsTestApplication1.Properties.Settings). Como consecuencia, si desea acceder a la configuración desde el código que no está en el mismo espacio de nombres, es posible que deba utilizar una referencia completa. Dicho esto, tenga cuidado si copia todo el <applicationSettings>...</applicationSettings> sección de la configuración de una aplicación a otra; es posible que deba cambiar el espacio de nombres en la configuración de destino posteriormente.

  • Si está utilizando el Diseñador de configuración (pestaña Configuración en su proyecto), creará un archivo llamado Settings.Settings (junto con Settings.Designer.cs para acceder a las sesiones a través del código C #) en la sección Propiedades de su proyecto. Ésta es una copia de la configuración, ya que se almacenará en su Web.config o App.config archivo también (dependiendo de su tipo de proyecto, solo para la configuración del alcance de la aplicación; la configuración del alcance del usuario se almacena según el perfil del usuario). Puede crear adicionales *.settings archivos y utilícelos (como se describe aquí).

  • Si eres no usando el diseñador de configuraciones, o si está usando una herramienta como LinqPad, es posible que deba usar un enfoque diferente. Considera esto:

    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;
    }
    

    Puedes leer el tipo de cadena applicationSettings tratando la configuración como un XDocument. El ejemplo dado se limita al tipo de cadena y puede recuperar la configuración del ejemplo app.config anterior de la siguiente manera:
    var value=GetApplicationSetting("myOwnSetting", "WindowsFormsTestApplication1.Properties.Settings");

    Asimismo, puede crear una función similar GetUserSetting por defecto <userSettings> sección: Simplemente copie el código anterior, cambie el nombre del nombre de la función y reemplace applicationSettings en el xPathStr por userSettings.

  • Hay un método de actualización disponible para la configuración del usuario, que se describe aquí. Allí se pueden encontrar más detalles sobre la ubicación donde se almacenan las configuraciones de usuario.

  • los <appSettings> La sección en la configuración funciona de manera diferente, ya que no distingue el alcance de “Usuario” y “Aplicación” y no admite diferentes tipos de datos, solo cadenas. Sin embargo, es posible Lee y escribe las claves / valores de configuración. Si está interesado en el código, puede encontrarlo aquí (en stackoverflow):
    cómo leer / escribir la configuración de configuración de appSettings

  • Si no está seguro de si debe usar AppSettings o applicationSettings, luego Lee esto antes de que lo decidas.

¿Cómo creaste la configuración? ¿Utilizas el diseñador de configuraciones de VS? Si es así, debería crearle una clase fuertemente tipada para acceder a ellos. Por lo general, se accede mediante Properties.Settings.Default.SettingName

Creo que se prefiere usar applicationSettings en lugar de appSettings, pero la configuración de la aplicación es de solo lectura en tiempo de ejecución, es decir, no puede crearla desde su código, pero creo que es posible crear y agregar appSettings en tiempo de ejecución. Hice una pregunta sobre la diferencia

puede encontrar más información en msdn

Puede cargar el archivo de configuración en XmlDocument y recuperar applicationSettings del objeto dom. Aquí hay un ejemplo que encontré para cargar el archivo de configuración en el objeto 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 "";
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *