Archivo de la etiqueta: utilidades

sharplab.io una utilidad online para ver el código tal como lo compila .NET

Pues eso… viendo el video de Filip Ekberg sobre los record en C# 9.0 (siempre hay que intentar aprender más) me gustó ver que mientras explicaba el código se veía el código desemsamblado (como lo genera el compilador de .NET) y es usando una herramienta online accesible mediante el enlace a https://sharplab.io/.

Si pones la dirección https://sharplab.io/ en el navegador, te mostrará una ventana con dos paneles.

Con las siguientes capturas te voy explicando un poco cómo configurar el «entorno» de trabajo.

En la figura 1 vemos el entorno ya configurado para usar los compiladores de Roslyn, para eso indicamos master (11 nov 2020) (es la que hay a día de hoy 13 de noviembre) que como ves con más detalle en la figura 2 nos permite seleccionar el «framework» a usar para compilar el código que pongamos en el panel izquierdo.

En la figura 3 puedes ver que se pueden usar los tres lenguajes que se incluyen en .NET, es decir: C#, Visual Basic y F#.

En el panel derecho se muestra el código decompilado, por defecto es en C# (sí, aunque en la izquierda lo escribas con otro lenguaje diferente a C#).

Pero como puedes ver en la figura 4 se puede mostrar de otras formas, eso sí, si quieres ver el código tal como lo trata el compilador, éste será en C#.
Las otras opciones son, entre otras,. el código ensamblado IL o incluso en ejecución (Run).
Ya es cuestión de ir probando cada una de esas opciones de la figura 4 para ir viendo cómo nos muestra el código.

En la figura 5 puedes ver código de Visual Basic (en el panel izquierdo) y el resultado de compilarlo y mostrarlo en C#.

En la figura 6 te muestro un trozo de código de C# 9.0 usando las instrucciones de nivel superior (top-level statements) y los tipos de registro (record).

Pero fíjate que he señalado una clase que (al menos así parece ser) es requerida para poder usar el código de tipo nivel superior, es decir, sin necesidad de crear el método Main, etc.), ya que si quitas ese código te dará error, tal como puedes ver en la figura 7.

Y si te gusta usar el tema oscuro, en la parte inferior derecha (junto a Theme) puedes seleccionar entre Auto, Light y Dark. A mí me ha mostrado el modio claro (Light) cuando lo inicié y ahí abajo me indicaba Auto tal como puedes ver en la figura 1.

Y esto es todo… es cuestión de ir practicando y probar más cosas de esta útil herramienta online.

Figura 1.

Figura 2.

Figura 3.

Figura 4.

Figura 5.

Figura 6.

Figura 7.

Nos vemos.
Guillermo

gsColorearCodigo

Esta es la última versión de la utilidad gsColorearCodigo (a fecha del 27 de octubre de 2020) en la que he usado Visual Studio 2019 y .NET 4.8.

Pulsa este enlace si quieres ver la versión original (creada para .NET 2.0).

 

Descripción de gsColorearCodigo

Nota del 27/Oct/2020
La revisión actual a la versión 1.0.0.12  (y la instalación de ClickOnce) están ajustadas a la compilación de fecha de hoy martes 27 de octubre de 2020.
También está actualizado el código en github con la «
release» de los ejecutables (por si quieres descargar directamente los binarios y no instalarlos con ClickOnce.
Por supuesto, en github está el código fuente de gsColorearCodigo y de la DLL gsColorearNET creada con .NET Standard 2.0.

 

Nota del 26-oct-2020 20:59:
Esta página estaba originalmente publicada en elguille.info y la he pasado al blog para poder editarla más fácilmente ya que lo que publico en elGuille.info lo hago con un editor de texto normal y corriente… y ¡es un rollo!
Por supuesto, esta misma página aparecerá en elGuille.info, así que… no se notará mucho que no está realmente ubicada allí.

 

NOTA del 24/Oct/2020
Revisión de esta utilidad usando la nueva versión publicada hoy de gsColorearNET en NuGet.
He actualizado también la instalación de ClickOnce.

 

Nota del 12/Sep/2020
Estoy probando la utilidad de colorear en .NET 5.0 Preview 8 y a duras penas ya está operativa…
es que el editor de Visual Studio 2019 Preview está aún muy verde para las aplicaciones de Windows Forms para Visual Basic.

El hacerlo con esa versión es para poder depurar el código de la DLL de colorear, ya que en un proyecto de .NET framework
no se puede… o yo no sé cómo hacerlo… todo hay que decirlo.

Cuando tenga tiempo publicaré en el blog las cosillas que recomiendo hacer hasta que mejoren el editor/diseñador de WinForms para Visual Basic.

Nota del 11/Sep/2020:
Esta nueva versión utiliza la librería de colorear código compilada para .NET Standard 2.0.
Esa DLL la he instalado desde el paquete de NuGet que he creado para la DLL gsColorearNET.
No he probado el instalador de ClickOnce en otro equipo, así que no sé si será totalmente operativo 😉
Al menos lo es en mi propio equipo…
De todas formas, actualizaré el código fuente de la nuevas versión, que aparte de usar esa DLL de colorear,
también tiene otros cambios (mejoras) con respecto a la actualización anterior del 9 de septiembre pasado.

El programa principal y la DLL de colorear están compilados con Visual Studio 2019,
en el caso de la utilidad (gsColorearCodigo.exe) utilizando el .NET Framework 4.8,
y la DLL (gsColorearNET.dll) está compilada para usar .NET Standard 2.0.

 

Entre otras cosas, esta versión (aparte de las mejoras en gsColorearNET) incluye la opción de «Colorear desde RTF» (ver la Figura 1).
Así como algunos cambios en la pestaña de configuración (ver figura 2) y en la ventana de mostrar RTF, que ahora permite
cambiar el código RTF y al pulsar en el botón RTF se muestran los cambios realizados.

 

Opción de colorear desde RTF
Figura 1. Colorear desde RTF

Es la opción que en un 99.99% de las veces utilizo para colorear el código ya que me permite copiar el texto de Visual Studio (es lo que se ve detrás de la utilidad) lo pego en la aplicación y al usar esa opción de Colorear desde RTF lo que hace es colorear para HTML usando el código de RTF, es decir, no comprueba las palabras clave, etc., para generar el código HTML a usar en una página WEB.

 

Opciones de configuración
Figura 2. Pestaña de opciones

 

Instalar gsColorearCodigo (y el código fuente)

Para instalar la utilidad puedes hacerlo de dos formas:

  • Usando el ZIP que hay más abajo, pero tendrás que compilarlo ya que el ejecutable no se incluye, solo el código fuente para Visual Basic.
  • Instalándolo por medio de ClickOnce (recomendado), ya que así podrás recibir notificaciones cuando haya alguna nueva versión e instalarla automáticamente.

En cualquier caso, lo instales directamente o por medio de ClickOnce, desde la ventana de Acerca de puedes comprobar si hay nuevas versiones del programa o también mirando esta página, que al fin y al cabo es la que usa el programa para saber si hay nuevas versiones (o actualizaciones).

Nota:
En realidad la página que mira para ver si hay nuevas actualizaciones es la anterior (la original creada con .NET 2.0) pero he puesto allí la misma versión que en esta… y cuando actualice nuevamente la utilidad, cambiaré el enlace para que mire esta página.
Esto es así porque esta página la he publicado después de compilar y crear el instalador. Smile

 

Más abajo tienes los enlaces con el código completo para Visual Basic usando una solución de Visual Studio 2019 con .NET 4.8 en el que se hace referencia a la DLL gsColorearNET instalada con el package de NuGet.

Espero que te sea de utilidad Smile

Nos vemos.
Guillermo

 

 

El ZIP con el código completo

El código tanto de la aplicación gsColorearCodigo para .NET Framework 4.8 como de la DLL gsColorearNET para .NET Standard 2.0 lo puedes descargar desde GitHub

 

Estos son los enlaces a github para el código fuente:
El código fuente de gsColorearCodigo (la aplicación) para .NET Framework 4.8
El código fuente de gsColorearNET (la DLL) para .NET Standard 2.0

 

Pulsa aquí si la quieres instalar con ClickOnce.

 

gsColorearNET

Nota del 26-oct-2020 20:45:
Esta página estaba originalmente publicada en elguille.info y la he pasado al blog para poder editarla más fácilmente ya que lo que publico en elGuille.info lo hago con un editor de texto normal y corriente… y ¡es un rollo!
Por supuesto, esta misma página aparecerá en elGuille.info, así que… no se notará mucho que no está realmente ubicada allí.

 

Esta es una biblioteca (DLL) compilada para .NET Standard 2.0 y así poder usarla en cualquier plataforma que lo acepte, incluidos los proyectos de .NET Framework 4.6.1 a 4.8 y de .NET Core 2.0 a .NET 5.0, entre otros…
Si quieres ver dónde se pueden usar las DLL compiladas con .NET Standard 2.0 mira este enlace: .NET Standard

Últimas actualizaciones

Nota del 24/Oct/2020 (v1.0.0.14)
He actualizado tanto el paquete de NuGet como el código en GitHub.
También la utilidad de gsColorearCodigo para que use esta nueva versión.

Los cambios principales son para no eliminar las líneas en blanco que haya en el código.
Esto era porque la función Split original de Visual Basic no elimina las líneas en blanco.
Además de usar vbCr en lugar de vbCrLf al examinar cada línea y crear nuevas separaciones, ya que al añadir vbCrLf añadía una línea extra en blanco.

Aunque últimamente se me ha dado el problema que no todos los ficheros tienen el mismo tipo de retorno de carro.
Por tanto he tenido que comprobar antes de hacer el Split qué tipo de retorno de carro tiene: vbCrLf o vbCr o vbLf.

Nota del 16/Sep/2020 (v1.0.0.7)
He actualizado tanto el paquete de NuGet como el código en GitHub.
También la utilidad de gsColorearCodigo para que use esta nueva versión.

Los cambios principales son para no eliminar las líneas en blanco que haya en el código.
Esto era porque la función Split original de Visual Basic no elimina las líneas en blanco.
Además de usar vbCr en lugar de vbCrLf al examinar cada línea y crear nuevas separaciones, ya que al añadir vbCrLf añadía una línea extra en blanco.

Nota del 13/Sep/2020 (v1.0.0.6)
He actualizado tanto el paquete de NuGet como el código en GitHub.
También la utilidad de gsColorearCodigo para que use esta nueva versión.

Con fecha del 12 de septiembre de 2020 he creado un repositorio en gitHub para el código de gsColorearNET.

De ahí puedes descargar el proyecto completo a excepción del fichero de nombre seguro (.snk)

Este es el enlace: gsColorearNET en gitHub.

Y este es el enlace a los paquetes de NuGet: gsColorearNET en NuGet.

Estoy probando la utilidad de colorear en .NET 5.0 Preview 8 y a duras penas ya está operativa… es que el editor de Visual Studio 2019 Preview está aún muy verde para las aplicaciones de Windows Forms para Visual Basic (y para C# tampoco está muy fino).

El hacerlo con esa versión es para poder depurar el código de la DLL de colorear, ya que en un proyecto de .NET framework no se puede… o yo no sé cómo hacerlo… todo hay que decirlo.

Cuando tenga tiempo publicaré en el blog las cosillas que recomiendo hacer hasta que mejoren el editor/diseñador de WinForms para Visual Basic.

NOTA:
Aún la estoy probando desde NuGet ya que usándola como proyecto compila y funciona bien, pero al publicar el paquete en NuGet (aquí tienes el enlace: gsColorearNET en NuGet), no me encuentra los lenguajes de las palabras clave.
¡Esto último ya está solucionado con el paquete 1.0.0.1!
Smile

He publicado la utilidad de colorear código (gsColorearCodigo) para instalar con ClickOnce que utiliza el paquete de NuGet 1.0.0.1 y… ¡funciona a la perfección!

Por ahora no te voy a poner el código fuente, en realidad ha cambiado poco desde lo que publiqué anteayer, y como lo que quiero añadir o corregir aún lo tengo que hacer… pues… habrá que esperar unos días a que lo tenga terminado y así ya la publico de forma, que salvo que haya algunos fallos, no tenga que modificarla en algún tiempo.

Lo que sí haré es actualizar el paquete de NuGet con las correcciones que le vaya haciendo.

Sobre el uso de un proyecto DLL de .NET Standard con un proyecto de .NET Framework

Probando el código de gsColorearCodigo usando el .NET 4.8 en Visual Studio 2019 con el proyecto de gsColorearNET usando .NET Standard 2.0, al producirse un error (o sin que se produzca) y querer depurar en el código de la DLL, el VS no me dejaba…
Así que… para comprobar porqué fallaba el penúltimo cambio que le hice, tuve que
abrir un proyecto de .NET 5.0 (Preview 8) usando el Visual Studio Preview, y en ese entorno si pude depurar y averiguar cuál era el fallo… que después resultó ser algo trivial, pero…

Así qué… ya sabes… si mezclas… no debugues… 😉

Usar código de Visual Basic en .NET Standard

Otra de las cosillas que me he encontrado a la hora de poder compilar el código del proyecto gsColorear para .NET Framework (ya hay que ir haciendo las aclaraciones de que no todo es simplemtente .NET, porque tenemos .NET Framework, .NET Core, .NET Standard y… casi ya… también simplemente .NET refiriéndose a .NET Core) es la definición de algunas de las funciones del ensamblado Microsoft.VisualBasic en concreto de la clase Strings que no están definidas en .NET Standard 2.0, tal como:
Len, Left, Mid, Right, Split, InStr y Trim.

Para no tener que cambiar todo el código que usaba esas funciones (recuerda que el código de colorear lo hice sobre el año 2001, sí, con Visual Basic 6.0, después en diciembre del 2002 lo pasé a la beta de Visual Studio .NET, la aplicación de aquél entonces era HTMLColorCode, aunque debo tener otra aplicación llamada gsEditor… el tiempo no perdona… por la memoria…) así que… me he creado una clase en la que
he definido esas funciones, que (seguramente) pueden mejorarse, pero… así las he programado / codificado / como prefieras decirlo.

Y te pego aquí el código por si te puede ser de ayuda.

'------------------------------------------------------------------------------
' Clase definida en la biblioteca para .NET Standard 2.0            (10/Sep/20)
' Basada en gsColorear y gsColorearCore
'
' VBCompat                                                          (10/Sep/20)
' Clase con instrucciones para compatibilidad con .NET Standard 2.0
'
' Declaro algunas funciones de Microsoft.VisualBasic.Strings
' que no están en .NET Standard 2.0
'
' (c) Guillermo (elGuille) Som, 2020
'------------------------------------------------------------------------------
Option Strict On
Option Infer On
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
'Imports System.Data
Public Class VBCompat
    ''' <summary>
    ''' Devuelve los caracteres desde la posición (en base 1)
    ''' hasta el final.
    ''' </summary>
    ''' <param name="str"></param>
    ''' <param name="pos"></param>
    Public Shared Function Mid(str As String, pos As Integer) As String
        Return str.Substring(pos - 1)
    End Function
    ''' <summary>
    ''' Devuelve la cadena desde la posición indicada con len caracteres.
    ''' La posición del primer carácter es el 1.
    ''' </summary>
    ''' <param name="str"></param>
    ''' <param name="pos"></param>
    ''' <param name="len"></param>
    ''' <remarks>10/Sep/20/20</remarks>
    Public Shared Function Mid(str As String, pos As Integer, len As Integer) As String
        Return str.Substring(pos - 1, len)
    End Function
    ''' <summary>
    ''' Devuelve el número de caracteres.
    ''' Si es cadena vacía o nulo devuelve 0.
    ''' </summary>
    ''' <param name="str"></param>
    ''' <returns></returns>
    Public Shared Function Len(str As String) As Integer
        If String.IsNullOrEmpty(str) Then Return 0
        Return str.Length
    End Function
    ''' <summary>
    ''' Devuelve los primeros caracteres de la cadena.
    ''' </summary>
    ''' <param name="str"></param>
    ''' <param name="len"></param>
    ''' <returns></returns>
    Public Shared Function Left(str As String, len As Integer) As String
        Return str.Substring(0, If(len > str.Length, str.Length, len))
    End Function
    ''' <summary>
    ''' Devuelve los caracteres indicados desde la derecha.
    ''' </summary>
    ''' <param name="str"></param>
    ''' <param name="len"></param>
    ''' <returns></returns>
    Public Shared Function Right(str As String, len As Integer) As String
        Dim iPos = str.Length - len
        Return str.Substring(iPos, len)
    End Function
    ''' <summary>
    ''' Devuelve la posición (en base 1) de la segunda cadena en la primera
    ''' </summary>
    ''' <param name="str1"></param>
    ''' <param name="str2"></param>
    ''' <returns></returns>
    Public Shared Function InStr(str1 As String, str2 As String) As Integer
        Return str1.IndexOf(str2) + 1
    End Function
    ''' <summary>
    ''' Devuelve la posición (en base 1) de la segunda cadena en la primera 
    ''' empezando en la posición indicada.
    ''' </summary>
    ''' <param name="startPos"></param>
    ''' <param name="str1"></param>
    ''' <param name="str2"></param>
    ''' <returns></returns>
    Public Shared Function InStr(startPos As Integer, str1 As String, str2 As String) As Integer
        Return str1.IndexOf(str2, startPos - 1) + 1
    End Function
    ''' <summary>
    ''' Devuelve una cadena después de haber quitado 
    ''' los espacios delante y detrás.
    ''' </summary>
    ''' <param name="str"></param>
    ''' <returns></returns>
    Public Shared Function Trim(str As String) As String
        Return str.Trim
    End Function
    ''' <summary>
    ''' Divide una cadena en elementos de un array.
    ''' Usando el delimitador indicado.
    ''' </summary>
    ''' <param name="Expression"></param>
    ''' <param name="Delimiter"></param>
    ''' <returns></returns>
    Public Shared Function Split(Expression As String, Optional Delimiter As String = " ") As String()
        Return Expression.Split(Delimiter.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
    End Function
    ''
    '' El código IL de Prueba1 es más corto (y parece que eficiente) que el de Prueba2
    ''
    'Public Shared Function Prueba1(str As String, len As Integer) As String
    '    Return str.Substring(0, If(len > str.Length, str.Length, len))
    'End Function
    'Public Shared Function Prueba2(str As String, len As Integer) As String
    '    If len > str.Length Then
    '        len = str.Length
    '    End If
    '    Return str.Substring(0, len)
    'End Function
End Class

Y esto es todo por ahora…

Espero que te sea de utilidad

Nos vemos.
Guillermo

 

 

El código fuente completo

El código para Visual Basic con el proyecto para Visual Studio 2019 está publicado en gitHub.

 

Este es el enlace: gsColorearNET en gitHub.

 

Y este es el enlace a los paquetes de NuGet: gsColorearNET en NuGet.

 

 

Utilidad para colorear el código a mostrar en páginas WEB (gsColorearCodigo)

Pues eso… si eres de los que no entran habitualmente en el sitio del Guille (www.elguille.info) y prefieres ver las cosas publicadas aquí en el blog, te diré que ayer publiqué la nueva versión de la utilidad gsColorearCodigo. Y digo NUEVA porque la actualización anterior que publiqué fue hace ya unos 13 añitos de nada 😉 y era para .NET 2.0, mientras que la nueva es para .NET Framework 4.8.

Para facilitar la «coloración» del código a publicar en la WEB esta nueva versión permite copiar el código de Visual Studio, pegarlo en la ventana de la utilidad y generar el código HTML a partir del contenido RTF (ver la figura 1).

Figura 1. La utilidad gsColorearCodigo usando Colorear desde RTF

Esto tiene dos ventajas, la primera es que no es necesario que la utilidad analice el código fuente buscando palabras clave y comentarios, etc. Ya que lo único que tiene que hacer es convertir el código interno del formato RTF y convertirlo en etiquetas span.

Además que al hacerlo así se gana tiempo… te lo digo por experiencia, ya que prácticamente todo el código coloreado que publico desde hace 12 o 13 años lo hago usando esa opción… así que… ya sabes… 😉

Y para muestra, un código coloreado, precisamente el que usé para hacer la captura de la figura 1.

Te lo vuelvo a mostrar en la captura de la figura 2, que es el editor de Visual Studio 2019.

Figura 2. El código a copiar del editor de Visual Studio 2019

Y este es el código HTML generado :

''' <summary>
''' Devuelve la versión de la DLL.
''' Si completa es True, se devuelve también el nombre de la DLL:
''' gsColorear v 1.0.7.0 (para .NET Framework 4.7.2 revisión del dd/MMM/yyyy)
''' </summary>
Public Shared Function Version(Optional completa As Boolean = False) As String
    Dim res = ""
    Dim ensamblado = System.Reflection.Assembly.GetExecutingAssembly
    'Dim m_fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(ensamblado.Location)
    'res = $"v {m_fvi.FileVersion}"

    Dim versionAttr = ensamblado.GetCustomAttributes(GetType(System.Reflection.AssemblyVersionAttribute), False)
    'DirectCast(DirectCast(versionAttr, System.Reflection.AssemblyVersionAttribute())(0), System.Reflection.AssemblyVersionAt
    Dim vers = If(versionAttr.Length > 0, (TryCast(versionAttr(0), System.Reflection.AssemblyVersionAttribute)).Version,
                                      "1.0.7.0")
    Dim fileVerAttr = ensamblado.GetCustomAttributes(GetType(System.Reflection.AssemblyFileVersionAttribute), False)
    Dim versF = If(fileVerAttr.Length > 0, (TryCast(fileVerAttr(0), System.Reflection.AssemblyFileVersionAttribute)).Version,
                                      "1.0.7.1")

    res = $"v {vers} ({versF})"

    If completa Then
        Dim prodAttr = ensamblado.GetCustomAttributes(GetType(System.Reflection.AssemblyProductAttribute), False)
        Dim producto = If(prodAttr.Length > 0, (TryCast(prodAttr(0), System.Reflection.AssemblyProductAttribute)).Product,
                                        "gsColorear")

        res = $"{producto} {res} (para .NET Framework 4.7.2 revisión del 09/Sep/2020)"
    End If
    Return res
End Function

En este caso, el VS no ha pasado los colores de los tipos (verde azulado), pero en otras ocasiones sí que lo hacía y quedaba guay, pero últimamente no le pasa los datos del color al código que utiliza de RTF… en fin…

 

Nota adicional sobre el coloreado de Visual Studio

Comenté en el párrafo anterior que Visual Studio no pasa los colores de las clases (verde azulado) y antes lo hacía. ¿Lo habrán quitado?

No, no lo han quitado.

Y es que el que lo haga o no depende de una opción en la configuración del editor de textos de Visual Studio.

Esa opción en español es: Usar clasificación precisa.
En inglés es: Use accurate classification.

Y con esos nombres… ¿Quién lo iba a saber?

Para poder cambiar (activar) esa opción lo tienes que hacer en: (ver la captura)
Herramientas>Opciones>Editor de textos>Avanzadas
En inglés sería:
Tools>Options>Text editor>Advanced

Opción para que al copiar el código en Visual Studio coloree también las definiciones de los tipos

Fíjate que también tiene que estar seleccionada la opción Copiar texto enriquecido al copiar o cortar (Copy rich text on copy/cut).

Al pegar el texto coloreado, quedaría así:

''' <summary>
''' Devuelve la versión de la DLL.
''' Si completa es True, se devuelve también el nombre de la DLL:
''' gsColorear v 1.0.7.0 (para .NET Framework 4.7.2 revisión del dd/MMM/yyyy)
''' </summary>
Public Shared Function Version(Optional completa As Boolean = False) As String
    Dim res = ""
    Dim ensamblado = System.Reflection.Assembly.GetExecutingAssembly
    'Dim m_fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(ensamblado.Location)
    'res = $"v {m_fvi.FileVersion}"

    Dim versionAttr = ensamblado.GetCustomAttributes(GetType(System.Reflection.AssemblyVersionAttribute), False)
    'DirectCast(DirectCast(versionAttr, System.Reflection.AssemblyVersionAttribute())(0), System.Reflection.AssemblyVersionAt
    Dim vers = If(versionAttr.Length > 0, (TryCast(versionAttr(0), System.Reflection.AssemblyVersionAttribute)).Version,
                                      "1.0.7.0")
    Dim fileVerAttr = ensamblado.GetCustomAttributes(GetType(System.Reflection.AssemblyFileVersionAttribute), False)
    Dim versF = If(fileVerAttr.Length > 0, (TryCast(fileVerAttr(0), System.Reflection.AssemblyFileVersionAttribute)).Version,
                                      "1.0.7.1")

    res = $"v {vers} ({versF})"

    If completa Then
        Dim prodAttr = ensamblado.GetCustomAttributes(GetType(System.Reflection.AssemblyProductAttribute), False)
        Dim producto = If(prodAttr.Length > 0, (TryCast(prodAttr(0), System.Reflection.AssemblyProductAttribute)).Product,
                                        "gsColorear")

        res = $"{producto} {res} (para .NET Framework 4.7.2 revisión del 09/Sep/2020)"
    End If
    Return res
End Function

 

Lo que si hace es usar la coloración de las cadenas con los argumentos de las cadenas interpoladas (las que se usan poniendo un signo dólar delante del inicio de las comillas dobles) que utiliza la coloración de Visual Studio, mientras que si lo haces con el comando Colorear en HTML, todo el contenido de la cadena estaría de color rojo, tal como puedes ver a continuación.

        res = $"{producto} {res} (para .NET Framework 4.7.2 revisión del 09/Sep/2020)"
    End If
    Return res
End Function

Aunque con la utilidad puedes configurar los colores y usar Colorear en HTML y mostrar el código con el look ese que tanto le gusta a «los otros» 😉

''' <summary>
''' Devuelve la versión de la DLL.
''' Si completa es True, se devuelve también el nombre de la DLL:
''' gsColorear v 1.0.7.0 (para .NET Framework 4.7.2 revisión del dd/MMM/yyyy)
''' </summary>
Public Shared Function Version(Optional completa As Boolean = False) As String
    Dim res = ""
    Dim ensamblado = System.Reflection.Assembly.GetExecutingAssembly
    'Dim m_fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(ensamblado.Location)
    'res = $"v {m_fvi.FileVersion}"

    Dim versionAttr = ensamblado.GetCustomAttributes(GetType(System.Reflection.AssemblyVersionAttribute), False)
    'DirectCast(DirectCast(versionAttr, System.Reflection.AssemblyVersionAttribute())(0), System.Reflection.AssemblyVersionAt
    Dim vers = If(versionAttr.Length > 0, (TryCast(versionAttr(0), System.Reflection.AssemblyVersionAttribute)).Version,
                                      "1.0.7.0")
    Dim fileVerAttr = ensamblado.GetCustomAttributes(GetType(System.Reflection.AssemblyFileVersionAttribute), False)
    Dim versF = If(fileVerAttr.Length > 0, (TryCast(fileVerAttr(0), System.Reflection.AssemblyFileVersionAttribute)).Version,
                                      "1.0.7.1")

    res = $"v {vers} ({versF})"

    If completa Then
        Dim prodAttr = ensamblado.GetCustomAttributes(GetType(System.Reflection.AssemblyProductAttribute), False)
        Dim producto = If(prodAttr.Length > 0, (TryCast(prodAttr(0), System.Reflection.AssemblyProductAttribute)).Product,
                                        "gsColorear")

        res = $"{producto} {res} (para .NET Framework 4.7.2 revisión del 09/Sep/2020)"
    End If
    Return res
End Function

Por si te interesa, aquí tienes los colores a usar y el valor de «pre» para conseguir ese coloreado del código:

Tag del formato <pre>:
<pre style=»background-color:black; color:#dcdcdc»>
Color texto: d69d85
Color comentario: 57a64a
Color documentación (XML): 57a64a
Color instrucciones: 569cd6

Bueno, no te canso más… espero que te sea de utilidad y la uses si necesitas colorear código para publicar en una sitio web.

El código fuente y el instalador de ClickOnce lo encontrarás en la página que publiqué en elGuille.info.

Este es el enlace para instalar la utilidad con ClickOnce y este otro es para que veas la página de la utilidad gsColorearCodigo en elguille.info.

 

¡Hasta pronto y que lo colorees bien! 🙂

 

Nos vemos.
Guillermo

P.S.
Ahora que veo el código publicado… no queda mal el fondo negro con el resto de colores… lo mismo modifico la utilidad de colorear para que al colorear desde RTF utilice esos colores en vez de los «predeterminados», que yo creo que son los que recoge del código RTF de Visual Studio, pero lo mismo es fácil de cambiarlos.
Si lo logro, ya te enterarás con una nueva actualización 😉

dotPeek de JetBrains, decompilador para punto NET

Pues eso… que viendo los tweets de mi amigo Marino Posadas (‏@MarinoPosadas) me he encontrado con este decompilador para ensamblados de .NET que han publicado de forma gratuita la gente de JetBrains.

En esta versión 1.0 decompila en C# no sé si en futuras versiones lo hará en otros lenguajes (o al menos en el más mejor del mundo mundial: Visual Basic) y por ahora es totalmente gratuito… a ver si esa gratuitidad le dura pa siempre, que si no, nos va a pasar como con Reflector, que empezó siendo "de gratis" y ahora… en fin… pues eso…

Si quieres bajarte esta aplicación, puedes hacerlo desde la página de descargas de dotPeek 1.0 (es decir, pulsando en el link o enlace anterior).

 

Espero que te sea de utilidad.

 

Nos vemos.
Guillermo