Índice de la sección dedicada a .NET (en el Guille) Cómo... en .NET

Equivalencia en C# de las funciones GetSetting y SaveSetting de VB
Para guardar valores en el mismo sitio del registro en el que lo guarda VB.NET, VB6 y el VB de Office

Publicado el 21/Abr/2004
Actualizado el 21/Abr/2004
Autor: Guillermo 'guille' Som


Tanto en las versiones de Visual Basic clásico como en la de punto NET, podemos usar funciones nativas de Visual Basic para leer y guardar valores en el registro de Windows, particularmente en la clave: HKEY_CURRENT_USER\Software\VB and VBA Program Settings. Esta clave del registro se empezó a usar con la versión de Visual Basic 4.0 de 32 bits y es el sustituto a los ficheros INI, (en la versión de 16 bits se guardaba en un fichero con extensión .INI).
Las funciones de VB que se encargan de leer y escribir en esa rama del registro son las funciones GetSetting y SaveSetting respectivamente.

En C# no existen funciones equivalentes para leer y guardar datos en el registro, ni en esa rama ni en otras. Aunque esto no es ningún problema, ya que para escribir en el registro con C#, podemos usar la clase RegistryKey (y otras relacionadas) del .NET Framework, (esa misma clase también la podemos usar en Visual Basic).

Pero es posible que nos interese usar la parte del registro que Microsoft ha destinado para que las aplicaciones escritas en cualquier versión de Visual Basic (incluso el VB de Office) guarden sus valores de configuración (al estilo INI), en ese caso tenemos que saber que la clave usada por VB es la que he indicado al principio.
Sabiendo esto, (es decir, dónde guardar los datos), podemos crear unas funciones equivalentes para C# que hagan lo mismo que GetSetting y SaveSetting.

Nota:
Seguramente los programadores "natos" de C# dirán que esto no les servirá de nada, ya que no tendrán que usar esa clave del registro... y en caso de que lo tengan que hacer... no lo harán por "compatibilidad" con Visual Basic...
Es que esta gente de C# (al igual que los de C/C++) son muy suyos... y con tal de no tener nada que ver con Visual Basic... pues eso... je, je...

¡Que nadie se moleste! Que este comentario va dirigido a un par que yo me se...

¡Ah! que te has dado por aludido... pues...

Hay que tener en cuenta que la función GetSetting permite que el último parámetro sea opcional, en Visual Basic no habría problemas, usamos Optional y asunto arreglado, pero en C# habrá que crear dos funciones sobrecargadas para poder usar el último parámetro o no... (en VB también podemos crear funciones sobrecargadas).

Cuando queramos guardar un valor en esa clave del registro (usando SaveSetting) tendremos que indicar estos parámetros:
AppName: Contiene el nombre de la aplicación o proyecto al que corresponde el valor.
Section: Contiene el nombre de la sección en la que se va a guardar la clave.
Key: Contiene el nombre de la clave que se va a guardar.
Setting: Contiene el valor que se va a asignar a Key.

En el caso de la función que lee los valores y devuelve una cadena con el valor (GetSetting), usaremos estos parámetros:
AppName: Contiene el nombre de la aplicación o proyecto cuya clave se solicita.
Section: Contiene el nombre de la sección donde se encuentra la clave.
Key: Contiene el nombre de la clave que se va a devolver.
Default: (Opcional) Contiene el valor que se va a devolver si la clave indicada por Key no existe. Si se omite, se asume que Default es una cadena de longitud cero ("").

Debido a que el parámetro Default es opcional, tendremos que crear una sobrecarga.

Veamos el código para estas dos funciones.
Debido a que se utilizan funciones de manipulación del registro, haremos una importación del espacio de nombres Microsoft.Win32 que es donde están definidas estas clases.

Empecemos por SaveSetting que al no devolver ningún valor, la declaramos como void (el equivalente a un Sub de Visual Basic):

public void SaveSetting(string appName, string section, string key, string setting)
{
    // Los datos se guardan en:
    // HKEY_CURRENT_USER\Software\VB and VBA Program Settings
    RegistryKey rk = Registry.CurrentUser.CreateSubKey(@"Software\VB and VBA Program Settings\" + 
                                                        appName + "\\" + section);
    rk.SetValue(key, setting); 
}

De la función GetSetting tendremos dos versiones, una en la que no se indica el último parámetro y otra en el que si se indica, con idea de tener la misma funcionalidad del último parámetro opcional.

public string GetSetting(string appName, string section, string key)
{
    return GetSetting(appName, section, key, "");
}
public string GetSetting(string appName, string section, string key, string sDefault)
{
    RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\VB and VBA Program Settings\" + 
                                                      appName + "\\" + section);
    string s = sDefault;
    if( rk != null )
        s = (string)rk.GetValue(key);
    //
    return s;
}

Si no se indica el último parámetro, se usará la primera función, que lo único que hace es llamar a la otra función pasando un valor de cadena vacía como valor por defecto.

Pues esto es todo.
Si eres programador nato de C# seguramente no te habré enseñado nada, pero si eres de esos que quieren cambiarse de Visual Basic a C#, seguramente sabrás apreciar este artículo.
Pero como suelo decir en otras ocasiones, si no te interesa... pues ni lo leas... aunque, claro, si estás leyendo este comentario es porque (seguramente) ya has leído lo anterior... así que... esta aclaración realmente no sirve de nada... (este Guille... con tal de meter baza...)

Abajo tienes el código de una prueba en Visual Basic que guarda un valor en esa clave del registro (usando las funciones propias) y otro de C# que, utilizando las funciones mostradas, lee el valor que la aplicación de VB guardó.

Espero que de algo te sirva... esa fue la intención.

Nos vemos.
Guillermo


Código para Visual Basic.NET (VB.NET)El código para VB .NET

'------------------------------------------------------------------------------
' Usar el registro con VB usando las funciones propias de VB        (21/Abr/04)
' Los valores se guardan en HKEY_CURRENT_USER\Software\VB and VBA Program Settings
'
' ©Guillermo 'guille' Som, 2004
'------------------------------------------------------------------------------

Module Module1
    Sub Main()
        guardar()
        ' Si no existe, usar un valor ficticio
        Console.WriteLine(leer((New DateTime(2004, 1, 1)).ToString("dd/MM/yyyy")))
        ' Console.WriteLine(leer())
        Console.ReadLine()
    End Sub

    Private Sub guardar()
        ' guarda un valor en el registro usando SaveSetting
        SaveSetting("registroVBA", "PruebaVB", "Fecha", DateTime.Now.ToString("dd/MM/yyyy"))
    End Sub

    Private Function leer() As String
        Return GetSetting("registroVBA", "PruebaCS", "Fecha")
    End Function
    Private Function leer(ByVal sDefault As String) As String
        Return GetSetting("registroVBA", "PruebaCS", "Fecha", sDefault)
    End Function
End Module

 


Código para C Sharp (C#)El código para C#

//-----------------------------------------------------------------------------
// Funciones en C# equivalentes a las de VB                            (21/Abr/04)
// para guardar valores en el registro
// Los valores se guardan en HKEY_CURRENT_USER\Software\VB and VBA Program Settings
//
// ©Guillermo 'guille' Som, 2004
//-----------------------------------------------------------------------------
using System;
using Microsoft.Win32;

class Class1
{
    static void Main()
    {
        //guardar();
        // Leer el valor guardado por el programa de VB
        // Si no existe, usar un valor ficticio
        Console.WriteLine(leer((new DateTime(2004,1,1)).ToString("dd/MM/yyyy")));
        // Console.WriteLine(leer());
        Console.ReadLine();
    }  
    private static void guardar()
    {
        // guarda un valor en el registro usando SaveSetting
        SaveSetting("registroVBA", "PruebaCS", "Fecha", DateTime.Now.ToString("dd/MM/yyyy"));
    }  
    static private string leer()
    {
        return GetSetting("registroVBA", "PruebaVB", "Fecha");
    }  
    static private string leer(string  sDefault)
    {
        return GetSetting("registroVBA", "PruebaVB", "Fecha", sDefault);
    }
    //
    // Las funciones equivalentes para C#
    //
    static private string GetSetting(string appName, string section, string key, string sDefault)
    {
        // Los datos de VB se guardan en:
        // HKEY_CURRENT_USER\Software\VB and VBA Program Settings
        RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\VB and VBA Program Settings\" + 
                                                          appName + "\\" + section);
        string s = sDefault;
        if( rk != null )
            s = (string)rk.GetValue(key);
        //
        return s;
    }
    static private string GetSetting(string appName, string section, string key)
    {
        return GetSetting(appName, section, key, "");
    }
    static private void SaveSetting(string appName, string section, string key, string setting)
    {
        // Los datos de VB se guardan en:
        // HKEY_CURRENT_USER\Software\VB and VBA Program Settings
        RegistryKey rk = Registry.CurrentUser.CreateSubKey(@"Software\VB and VBA Program Settings\" + 
                                                            appName + "\\" + section);
        rk.SetValue(key, setting); 
    }
}

 


la Luna del Guille o... el Guille que está en la Luna... tanto monta...