Respuesta

10

Los applicationSettings son de sólo lectura en tiempo de ejecución. Puede establecerlos/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 ámbito correcto:

  • Si la configuración se aplica a toda la aplicación (para todos los usuarios), seleccione "Aplicación" como ámbito.
  • Si cada usuario debe tener ajustes individuales (unido al perfil de usuario), a continuación, seleccione "Usuario"

Por ejemplo, si crea myOwnSetting en su proyecto WindowsFormsTestApplication1 de la siguiente manera:

myOwnSetting

se añadirá 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 de editor de texto) - después de guardar los cambios, desde el mismo espacio de nombre puede leer su valor en la aplicación fácilmente a través del siguiente código:

var currentValue = Properties.Settings.Default.myOwnSetting; 

Dada la applicationSettings en el listado superior, esto sería recuperar la cadena "¡Hola!" para la variable currentValue.

Nota que si ha creado myOwnSetting para la "Usuario" ámbito, a continuación, se almacena en una sección denominada <userSettings> en lugar de <applicationSettings>, pero todavía se puede acceder a ella con la línea de código de seguridad.

Otra diferencia de La configuración de "Usuario" es que tiene acceso de lectura-escritura, es decirse le permite hacer lo siguiente:

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

Si intenta lo mismo con la determinación del alcance "Aplicación" myOwnSetting, que daría lugar a un error en tiempo de compilación que le dice que es de sólo lectura.

Si reinicia la aplicación, observará que myUserSetting ha cambiado al valor "Algo más", pero el valor anterior aún está en la aplicación.config. ¿Por qué esto es tan? La razón es que se considera como un valor predeterminado, y como dije antes, el ámbito "Usuario" está vinculado al perfil del usuario. Como consecuencia, el valor de "algo más" se almacena en

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

en un archivo llamado User.config, que se ve de la siguiente manera:

<?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 se puede saber con exactitud el camino, ya que se crea automáticamente por .NET Framework, 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 ensamblaje que ha especificado y el nombre y la versión del ensamblado también se usan en la ruta.


Nota:

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

  • Como se puede ver en el archivo de configuración, el espacio de nombre 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 totalmente calificada. Una vez dicho esto, tenga cuidado si copia toda la sección <applicationSettings>...</applicationSettings> de la configuración de una aplicación a otra; es posible que necesite cambiar el espacio de nombre en la configuración de destino después.

  • Si está utilizando el Diseñador de configuración (ficha Configuración en el proyecto), se creará un archivo llamado Settings.Settings (junto con Settings.Designer.cs para acceder a las sessings a través de código C#) en la sección Propiedades de su proyecto. Esta es una copia de la configuración, ya que también se almacenará en su archivo Web.config o App.config (según el 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 archivos adicionales *.settings y usarlos (como se describe here).

  • Si eres no mediante el diseñador de configuración, o si está usando una herramienta como LinqPad, es posible que tenga que utilizar un enfoque diferente. Considere 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; 
    } 
    

    Usted puede leer tipo cadena applicationSettings tratando la configuración como XDocument. El ejemplo dado está limitado al tipo de cadena y puede recuperar la configuración desde la aplicación.ejemplo de configuración anterior de la siguiente manera:
    var value=GetApplicationSetting("myOwnSetting", "WindowsFormsTestApplication1.Properties.Settings");
    Del mismo modo, se puede crear una función similar GetUserSetting para la sección default <userSettings>: Sólo tienes que copiar el código anterior, cambie el nombre del nombre de la función y reemplazar applicationSettings en el xPathStr por userSettings.

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

  • La sección <appSettings> en la configuración funciona de manera diferente, ya que no distingue "usuario" y "Aplicación" el alcance y no es compatible con diferentes tipos de datos, sólo cadenas. Sin embargo, es posible leer y escribir fácilmente las claves/valores de configuración. Si usted está interesado en el código, se puede encontrar aquí (en stackoverflow):
    how to read/write config settings of appSettings

  • Si no está seguro si debe usar AppSettings o applicationSettings, entonces read this antes de decidir que .

4

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

Creo que es preferible utilizar la configuración de la aplicación en lugar de configuración de la aplicación, pero la configuración de la aplicación es de solo lectura, es decir, no se puede crear desde el código, pero es posible crear y agregar en tiempo de ejecución, creo. I asked a question about the difference

usted puede encontrar más información from msdn

3
Usted puede cargar el archivo de configuración en XmlDocument y retrive los applicationSettings del objeto DOM. Aquí es ejemplo que he encontrado 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 ""; 
} 
+0

He estado buscando TODO EL DÍA para encontrar una solución que realmente funcione. No tengo el lujo de hacer público mi archivo de configuración y acceder desde otros proyectos en WinForms. ¡Este es el camino a seguir! :) –

Cuestiones relacionadas