Etiqueta: Visual Studio

Posts relacionados con el entorno de desarrollo (IDE) de Visual Studio

  • ¿Te gustaría que a VB.NET le añadan nuevas características en .NET 5 (.NET Core)? pues… vota esta petición

    Pues eso… que eso de que a los que preferimos VB sobre C# para crear nuestras aplicaciones (y aunque no lo prefiriéramos) no nos debería parecer bien que la gente de Microsoft haya decidido no añadir nuevas características al lenguaje, dejándolo estancado… es decir, que si bien podremos seguir usándolo no le van a añadir nuevas características. Por eso he publicado una petición en la comunidad de desarrolladores de Microsoft para ver si no lo dejan de lado.

    Actualizado el 8-mar-2021

    Esta es la respuesta de la gente de Microsoft (por Kathleen Dollar ex-MVP de Visual Basic que ahora trabaja en Microsoft):

    Our strategy is here: https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/

    I do not think stabilizing the language blocks using new technologies in .NET 5.

    Almost all new .NET 5.0 features are in the libraries and tools, which Visual Basic takes can use. Even features such ref struct which are not available in VB improve VB applications because they speed up operations in the BCL. And the BCL has a commitment to provide VB (and F#) friendly overloads for BCL features.

    If there is a specific new feature, other than ref struct, that is blocking development, feel free to post a more specific issue.

    Y de paso ha cerrado el hilo. Su respuesta es del 6 de enero de este año de 2021, aunque yo lo vi ayer, le respondí y Daniel Seara también y con más firmeza aún, jejeje

    En fin… como le he contestado a Dani: Esto es lo que ahora nos podemos esperar los que usamos Visual Basic de la gente de desarrollo de Microsoft.

    Es decir, ¡ahí te quedas, y búscate la vida!

    En los enlaces que hay en el párrafo anterior están los enlaces a lo que comentó la gente del team de .NET sobre que Visual Basic no evolucionará como lenguaje aunque se podrá usar para generar aplicaciones de .NET 5.0 y .NET Core o .NET Standard (además de .NET Framework), pero te los repito: Visual Basic support planned for .NET 5.0 y la petición también la repito 😉 : Will be back Visual Basic evolve with C#?

    Y la petición que yo te hago a tí que estás leyendo esto es que pinches en el enlace de la petición (este) y vote por esa petición, si te parece conveniente, claro, que tampoco te voy a obligar… ¡Faltaría más!

    Y es que da la impresión de que los de Microsoft se han olvidado de todo (el dinero) que les ha dado Visual Basic (tanto para .NET como las versiones anteriores llamadas de forma genérica: VB6) y que lo abandonen de esa forma, mientras que F# si que seguirá evolucionando, que C# sea la estrella es porque está ligado 1 a 1 con el avance de .NET y por tanto debe seguir avanzando, tal como te expliqué en El porqué C# siempre tendrá novedades aunque Visual Basic ya no. Precisamente ahí te comenté lo que Anthony D. Green (un Program Manager de Visual Basic) opina sobre esto de que Microsoft no le dedique, al menos, la misma cantidad de persona que le dedica a F#, no, no tengo nada contra F#, solo que me extraña que un lenguaje que no usará ni la décima parte de la gente que usa VB.NET siga «palante» y VB no. Según ese señor, no sería necesario dedicarle más de tres personas (en nómina) aparte de los desarrolladores que quieran colaborar con el desarrollo (y la evolución) de Visual Basic. Si quieres, lee el artículo de Anthony y, aunque es un poco largo, deja muy claro las cosas.

    Y ya no te canso más. Solo decirte que si te animas a votar favorablemente por la petición te explico cómo hacerlo:

    Ve al sitio de Developer Community y accede a mi petición y pulsa en la flecha de arriba que está en la parte superior izquierda (ver la figura) para votar favorablemente, pero, por favor, no pulses en la flecha que señala para abajo, ya que quitarías votos… y no es plan 😉

    Para votar a favor, pulsa en la flecha que señala para arriba. Gracias.

    Agradecerte de antemano tu apoyo… y si quieres usar el hashtag (#evolvevb) pues mejor… que actualmente solo aparece un resultado y… no tiene nada que ver con evolucionar VB (que es lo que viene a significar evolveVB) 😉
    Si quieres puedes usar #evolucionarVB para que todo quede en casa.

    Por cierto, la Developer Community de Visual Studio está para añadir peticiones de nuevas características y para informar de bugs/fallos en Visual Studio y .NET.

    Pues nada más… ¡gracias!

    Nos vemos.
    Guillermo

  • En el roadmap de Visual Studio dicen que el diseñador de formularios de Windows de .NET 5 estará listo para diciembre

    Pues eso… que le estaba echando una visual al roadmap de Visual Studio 2019 y en el apartado de .NET aparece lo que te muestro en la figura 1, es decir, que ya tienen solucionados todos los problemas que tenía… vamos que el diseñador de formularios de Windows para las aplicaciones de .NET 5.0 es/era una caca de la vaca comparado con el diseñador de .NET Framework. Pero si es verdad que todo eso ya lo tienen listo (están marcados con una estrella verde) entonces un ¡OLÉ! grande para los desarrolladores de Visual Studio. A ver si en la próxima actualización de la versión Preview está disponible.

    Figura 1. Las cosas que ya tiene (cuando actualicen el VS) el diseñador de Windows Forms para .NET Core

    Otra cosa que me ha llamado la atención es lo que pone en la última estrella:
    Las aplicaciones de WinForms VB .NET 5 tienen experiencia de diseñador (en inglés: WinForms VB .NET 5 applications have designer experience), lo que yo entiendo de esa frase es que para Visual Basic (VB) hay un diseñador diferente que para C# y que tiene una ¿experiencia de diseño? (sigo sin enterarme qué significa eso jejeje, en fin).

    En serio, supongo que se refieren a que no nos van a dejar atrás en esto también a los que usamos Visual Basic .NET.

     

    Pues nada… habrá que esperar a la próxima o próximas actualizaciones de la Preview de Visual Studio 2019 v16.9 para ver qué experiencia de diseño tendremos los VBers 😉

     

    Nos vemos.
    Guillermo

  • Generar clave SHA1 con el nombre y password del usuario

    Pues eso… en este post te explico cómo generar una clave (usando la clase SHA1CryptoServiceProvider) formada a partir de dos cadenas, normalmente el nombre del usuario y el password (o contraseña), de esta forma se genera una cadena única (de 40 caracteres) de forma que si alguien accede a ella no sabrá nunca cuales fueron las dos cadenas que la formaron (o eso es lo que espero que ocurra, jejeje). Además te mostraré también una función para evitar que el usuario introduzca caracteres no válidos y que pueden se usados para acceder maliciosamente a una base de datos.
    Por supuesto, te mostraré el código tanto para Visual Basic como para C#.

    El código que te mostraré (al menos el de generar la clave SHA1) está basado en este código publicado en mi sitio (usando .NET 1.1):
    El ejemplo de Visual Basic .NET:
    comprobar_usuario_usando_base_datos_vb2003
    El ejemplo de C#:
    comprobar_usuario_usando_base_datos_cs2003

    Generar una clave SHA1 usando SHA1CryptoServiceProvider

    Para acceder a esta clase necesitas una importación del espacio de nombres System.Security.Cryptography y como en el código usaremos un objeto StringBuilder y UTF8Encoding, también habrá que importar System.Text.

    En el código de ejemplo para usar los métodos definidos en la clase UtilSHA1 (que será en la que defino los dos métodos usados) se hará una comprobación de si tanto en el nombre como en el password usado hay caracteres no válidos, los caracteres que compruebo en el método ValidarTextoClave son los caracteres: ?*%’_ y

    De esa forma intentamos asegurarnos que no se pueda hacer un SQL injection, es decir, intentar acceder maliciosamente a la base de datos a la que presumiblemente se quiere acceder.

    Veamos primero el código que usa los dos métodos, el de comprobar la validez del texto introducido (ValidarTextoClave) y el de generar la clave SHA1 (GenerarClaveSHA1).

    Método Main con el código de prueba para usar los métodos de la clase

    Como te dije antes, se pide el nombre del usuario y el password a usar para generar la cadena con la clave SHA1 (que será de 40 caracteres convertidos a mayúsculas).

    Este sería el código del método Main para Visual Basic, con las importaciones de los espacios de nombres necesarios en todo el código de ejemplo:

    Option Strict On
    Option Infer On
    
    Imports System
    
    Imports System.Text
    Imports System.Security.Cryptography
    
    Module Program
        Sub Main(args As String())
            
            dim valido As Boolean
            dim usuario As String
            dim passw as String
    
            Do
                Console.Write("Escribe el nombre del usuario: ")
                usuario = Console.ReadLine()
                ' si el nombre del usuario tiene caracteres no permitidos, preguntar de nuevo
                valido = UtilSHA1.ValidarTextoClave(usuario)
                if not valido
                    Console.WriteLine("Nombre de usuario NO VÁLIDO.")
                end if
            Loop While Not valido
    
            Do
                Console.Write("Escribe la clave: ")
                passw = Console.ReadLine()
                ' si la clave tiene caracteres no permitidos, preguntar de nuevo
                valido = UtilSHA1.ValidarTextoClave(passw)
                if not valido
                    Console.WriteLine("La clave NO ES VÁLIDA.")
                end if
            Loop While Not valido
    
            ' generar la clave SHA1 y mostrarla
            dim claveSHA1 = UtilSHA1.GenerarClaveSHA1(usuario, passw)
            Console.WriteLine($"La clave SHA1 es: '{claveSHA1}'.")
                
        End Sub
    End Module
    

     

    Este sería el código del método Main para C#, con las importaciones (using) de los espacios de nombres usados en el código:

    using System;
    
    using System.Text;
    using System.Security.Cryptography;
    
    class Program
    {
        static void Main(string[] args)
        {
            bool valido;
            string usuario;
            string passw;
    
            do
            {
                Console.Write("Escribe el nombre del usuario: ");
                usuario = Console.ReadLine();
                // si el nombre del usuario tiene caracteres no permitidos, preguntar de nuevo
                valido = UtilSHA1.ValidarTextoClave(usuario);
                if (!valido)
                    Console.WriteLine("Nombre de usuario NO VÁLIDO.");
            }
            while (!valido);
    
            do
            {
                Console.Write("Escribe la clave: ");
                passw = Console.ReadLine();
                // si la clave tiene caracteres no permitidos, preguntar de nuevo
                valido = UtilSHA1.ValidarTextoClave(passw);
                if (!valido)
                    Console.WriteLine("La clave NO ES VÁLIDA.");
            }
            while (!valido);
    
            // generar la clave SHA1 y mostrarla
            var claveSHA1 = UtilSHA1.GenerarClaveSHA1(usuario, passw);
            Console.WriteLine($"La clave SHA1 es: '{claveSHA1}'.");
        }
    }
    

     

    La clase UtilSHA1 con los métodos para comprobar la validez del texto y generar la clave

    A continuación te muestro el código del método para validar el texto del nombre del usuario y el password o contraseña para que no contenga caracteres no deseados.

    Para Visual Basic:

    ''' <summary>
    ''' Validar caracteres en la clave.
    ''' No se aceptan ?*%'_ ni --
    ''' </summary>
    Public Shared Function ValidarTextoClave(laClave As String) As Boolean
        Dim sNoVale As String = "?*%'_"
    
        laClave = laClave.Trim()
    
        If laClave.IndexOf("--") > -1 Then
            Return False
        End If
        If laClave.IndexOfAny(sNoVale.ToCharArray) > -1 Then
            Return False
        End If
    
        Return True
    End Function
    

     

    Para C#:

    /// <summary>
    /// Validar caracteres en la clave.
    /// No se aceptan ?*%'_ ni --
    /// </summary>
    public static bool ValidarTextoClave(string laClave)
    {
        string sNoVale = "?*%'_";
    
        laClave = laClave.Trim();
    
        if (laClave.IndexOf("--") > -1)
            return false;
        if (laClave.IndexOfAny(sNoVale.ToCharArray()) > -1)
            return false;
    
        return true;
    }
    

     

    Y ahora el código con la definición del método GenerarClaveSHA1 en el que indicaremos dos cadenas: el nombre del usuario y el password y a partir de la concatenación de ambas generar el valor SHA1 producido por el método ComputeHash que en realidad devuelve un array de tipo Byte, el cual convertimos en valores hexadecimales (con dos cifras por valor) con idea de que se genere la cadena deseada de 40 caracteres en total, que finalmente convertimos en mayúsculas, pero que bien puedes dejarlo en minúsculas si así te parece mejor.

    El código para Visual Basic:

    ''' <summary>
    ''' Generar una clave SHA1 para guardarla en lugar del password,
    ''' de esa forma no se podrá saber la clave.
    ''' La longitud es de 40 caracteres.
    ''' </summary>
    ''' <remarks>
    ''' Crear una clave SHA1 como la generada por:
    ''' FormsAuthentication.HashPasswordForStoringInConfigFile
    ''' Basado en el ejemplo de mi sitio:
    ''' http://www.elguille.info/NET/dotnet/comprobar_usuario_usando_base_datos_vb2003.htm
    ''' </remarks>
    Public Shared Function GenerarClaveSHA1(nick As String, clave As String) As String
        ' Crear una clave SHA1 como la generada por 
        ' FormsAuthentication.HashPasswordForStoringInConfigFile
        ' Adaptada del ejemplo de la ayuda en la descripción de SHA1 (Clase)
        Dim enc As New UTF8Encoding
        ' Por si el usuario (nick) es nulo
        If String.IsNullOrWhiteSpace(nick) Then
            nick = ""
        Else
            nick = nick.ToLower
        End If
        Dim data() As Byte = enc.GetBytes(nick & clave)
        Dim result() As Byte
    
        Dim sha As New SHA1CryptoServiceProvider
        ' This is one implementation of the abstract class SHA1.
        result = sha.ComputeHash(data)
    
        ' Convertir los valores en hexadecimal
        ' cuando tiene una cifra hay que rellenarlo con cero
        ' para que siempre ocupen dos dígitos.
        Dim sb As New StringBuilder
        For i As Integer = 0 To result.Length - 1
            If result(i) < 16 Then
                sb.Append("0")
            End If
            sb.Append(result(i).ToString("x"))
        Next
    
        Return sb.ToString.ToUpper
    End Function
    

     

    El código para C#:

    /// <summary>
    /// Generar una clave SHA1 para guardarla en lugar del password,
    /// de esa forma no se podrá saber la clave.
    /// La longitud es de 40 caracteres.
    /// </summary>
    /// <remarks>
    /// Crear una clave SHA1 como la generada por:
    /// FormsAuthentication.HashPasswordForStoringInConfigFile
    /// Basado en el ejemplo de mi sitio:
    /// http://www.elguille.info/NET/dotnet/comprobar_usuario_usando_base_datos_cs2003.htm
    /// </remarks>
    public static string GenerarClaveSHA1(string nick, string clave)
    {
        // Crear una clave SHA1 como la generada por 
        // FormsAuthentication.HashPasswordForStoringInConfigFile
        // Adaptada del ejemplo de la ayuda en la descripción de SHA1 (Clase)
        UTF8Encoding enc = new UTF8Encoding();
        // Por si el usuario (nick) es nulo
        if (string.IsNullOrWhiteSpace(nick))
            nick = "";
        else
            nick = nick.ToLower();
        byte[] data = enc.GetBytes(nick + clave);
        byte[] result;
    
        SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
        // This is one implementation of the abstract class SHA1.
        result = sha.ComputeHash(data);
    
        // Convertir los valores en hexadecimal
        // cuando tiene una cifra hay que rellenarlo con cero
        // para que siempre ocupen dos dígitos.
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < result.Length; i++)
        {
            if (result[i] < 16)
                sb.Append("0");
            sb.Append(result[i].ToString("x"));
        }
    
        return sb.ToString().ToUpper();
    }
    

     

    Nota:
    El código final del método GenerarClaveSHA1 se puede simplificar para que use dos caracteres hexadecimales sin necesidad de la comparación de si el valor es menor de 16.
    El código te lo muestro en el repositorio de github por si quieres intentarlo por tu cuenta 😉

     

    Nota importante:
    Comentarte que la generación de la clave SHA1 distingue entre mayúsculas y minúsculas, es decir, si al generar la clave SHA1 usaste Guillermo como usuario (o nick) si vuelves a generarla con el nombre en minúsculas (guillermo) el valor generado será diferente.
    Esto mismo es aplicable a la contraseña o password.

     

    El código completo con los proyectos para usar con .NET 5.0 (tanto con dotnet como con Visual Studio Code o con Visual Studio 2019 v16.8) está publicado en github:
    Generar clave SHA1 con el nombre y password del usuario.

     

    Y esto es todo… espero que te sea de utilidad… ya sabes que esa es la idea… y si te parece bien (y puedes) no estaría de más que dejaras una propina usando el enlace de PayPal 😉
    Gracias.

     

    Nos vemos.
    Guillermo