Etiqueta: VB.NET

Temas relacionados con Visual Basic para .NET Framework

  • Fallo en el editor de código de VB y C# en Visual Studio 2019

    Pues eso… estaba yo tan tranquilo escribiendo código en un formulario de Windows Forms cuando pasé al diseñador a mirar algún evento o nombre de un control y cuando volví al código… ¡HABÍA DESAPARECIDO!

    Noté que después de cambiar del diseñador al panel de código el asterisco (*) de modificado había desaparecido… Y (seguramente) la posición en el editor de código era la misma que cuando abrí el proyecto. Así que… me puse puse a buscar lo que había escrito (por si se hubiese cambiado la posición dentro del editor) y ¡el código no estaba!

    Era raro… muy raro…

     

     

    POSIBLE SOLUCIÓN (21-oct-2020):
    Me han escrito hoy los de Microsoft diciendo que la posible solución a este problema es hacer lo siguiente:

    Si tienes el Visual Studio 2019 en español sigue estos pasos (ver figura 5):
    En el menú Herramientas>Opciones>Entorno>Características en versión preliminar quitar la marca de la casilla Cargar proyectos más rápidamente.

    Figura 5. Quitar la selección de Cargar proyectos más rápidamente

     

    Si tienes el Visual Studio 2019 en inglés sigue estos pasos (ver figura 6):
    En el menú Tools>Options>Environment>Preview Features quitar la marca de la casilla Load projects faster.

    Figura 6. Quitar la selección de Load projects faster

    Si lo puedes comprobar, sería de agradecer 😉 

     

    Menos mal que se me ocurrió darle al botón DESHACER. ¡Y el código volvió a aparecer! (Y el asterisco de modificado también).

    Todo esto era en un proyecto para Visual Basic usando Visual Studio 2019 Community «normal», aunque después probé en la Preview y también ocurre.

    El problema

    Para un ejemplo de lo que ocurre ver el GIF animado de la figura 1 para que te hagas una idea.

    Figura 1. Fallo en el editor de formularios de Visual Studio 2019 usando Visual Basic

    Lo de mostrar la versión de Visual Studio es porque este GIF (y los que te voy a mostrar después) los mandé la notificación del problema a la comunidad de desarrollo (Developer Community).
    Ya que ellos (después de explicarles varias veces los pasos a seguir) no consiguieron reproducirlo y en sus capturas me mandaban la versión de Visual Studio que estaban usando.

     

    Nota del 18/Sep:
    Dicen que lo están investigando:
    This issue is currently being investigated. Our team will get back to you if either more information is needed, a workaround is available, or the issue is resolved.
    A ver qué ocurre…

     

    Los pasos a seguir, al menos así es como me ocurría más a menudo (aunque no siempre ocurría) son estos:

    1- Con cualquier proyecto de Visual Basic (al principio pensé que solo ocurre en VB, pero después comprobé que también ocurre en C#) deja abierto el formulario en modo de diseño y la ventana de código, de forma que el código tenga el foco antes de cerrar la solución (o el Visual Studio).
    2- Al abrir nuevamente Visual Studio, te mostrará la ventana de código.
    3- Escribe lo que sea y pasa a la ventana del diseñador de formularios.
    4- Vuelve a la ventana del editor y verás que el código antes escrito desaparece.
    5- Si lo quieres recuperar, tendrás que pulsar en el botón de deshacer.
    5a- En al menos una ocasión (creo que con la versión Preview y un proyecto de C# para .NET 5.0 Preview 8) mostró un aviso de que se perderán los cambios en el diseñador (o algo así, no le presté atención ya que no pensaba que iba a ocurrir esto de perder el código), pero al darle varias veces a deshacer, el código volvió.

    Pruebas y más pruebas

    Este problema no ocurre siempre, ese es realmente el problema.

    Para comprobar los fallos (y porque los de Microsoft me pidieron que les enviara un proyecto en el que ocurriera) creé un nuevo proyecto de Windows Forms para Visual Basic con .NET Framework 4.7.2 y, tras varias pruebas, se reprodujo el problema.

    También probé con proyectos de C#, tanto con la versión normal de Visual Studio como con la versión Preview. Pero no era capaz de que volviese ocurrir en C#, pero sí en VB. Así que… pensé que solo ocurría esto en los proyectos de los pobres y ya casi abandonados usuario de Visual Basic.

    Pero no: El problema también ocurre con proyectos de C#.
    Más sobre esto dentro de un momento.

    Usar una máquina virtual en Azure preparada para Visual Studio 2019

    Los de Microsoft (concretamente John Q., me preguntaron si esto mismo me ocurría en otros equipos o le ocurría a otros desarrolladores de mi equipo… ¡sic! ¡Solo tengo a un desarrollador en mi equipo! Y no, no tengo otros equipos (máquinas) en la que poder probarlo… Se me ocurrió que podría probarlo en una máquina virtual… Pero me daba pereza crear una máquina virtual, instalar el Visual Studio y probarlo, así que… se me ocurrió probarlo en una máquina virtual de Azure.

    Me creé una cuenta «FREE» de Azure (la que yo tenía ya caducó hace meses) con idea de usar allí una máquina virtual, pero la pereza era la misma… tener que crear una máquina virtual y tener que instalar el Visual Studio.

    Sé que hay (o al menos había) máquinas virtuales ya preparadas con Visual Studio y que Microsoft las pone a nuestra disposición, así que… me puse a buscarla y encontré esto en la documentación de Microsoft: Imágenes de Visual Studio en Azure.
    Uno de los enlaces activos era este: Visual Studio 2019: versión más reciente (16.5), pero el enlace estaba roto y no mostraba nada (salvo un error 404).

    Así que… usé el enlace para Azure Marketplace (en la misma página de las imágenes de Visual Studio en Azure) y también daba error 404. Pulsé en el enlace de esa misma página que indica Ir a Azure Marketplace y con un poco de paciencia la página apareció) y entré en el apartado Apps. Filtré para que me mostrase solo las de Microsoft como publisher para el sistema operativo Windows y el tipo de producto Virtual Machine Images.

    Y allí estaba: Visual Studio 2019 Latest.

    Figura 2. La máquina virtual de VS para Azure


    Al pulsar el enlace (no me deja copiarlo) muestra una ventana pop-up con las opciones que hay para seleccionar, primero seleccioné la versión Community para Windows 10, pero no me dejó instalarla, así que… posteriormente elegí la versión Visual Studio 2019 Comunity (latest release) on Windows Server 2019 y esa sí funcionó.

    Probando a repetir el problema con Visual Studio en la máquina virtual de Azure

    Allí probé el proyecto que les mandé y tras no-se-cuantas-miles-de-pruebas, el problema no se repetía.

    Lo más que me ocurrió fue algo que también me ha ocurrido más veces (y seguramente tendrá que estar en una nuevo problema para que lo resuelvan) y es que al pasar o mostrarse directamente la ventana de código al abrir el proyecto, esta se muestra totalmente en blanco, tal como puedes comprobar en la figura (GIF) número 3.

    Figura 3. Cuando te quedas en blanco mientras escribes código… o casi 😉

    Pero el fallo inicial no se reproducía en el proyecto de prueba de Visual Basic.

    El problema también ocurre con proyectos de C#

    Así que… me dio por crear un nuevo proyecto de C# para Windows Forms usando .NET Core 3.1, así de paso probaba qué características tiene ese tipo de proyecto, ya que con los de Visual Basic para .NET 5.0 Preview 8, son una caca… también para C#, ya que no puedes hacer casi nada en el diseñador de formularios, al menos no puedes enlazar los eventos ni editar visualmente los menús, etc., pero esa es otra historia.

    Y el fallo volvió a ocurrir… ya no recuerdo si fue a la primera o a la segunda… y eso que fue ayer… la cuestión es que funcionó y yo tenía la utilidad ScreenToGif lista para capturar los movimientos.

    Y los capturé, y en la figura 4 puedes ver que con un proyecto de C# también ocurre.

    Figura 4. El fallo de perder lo escrito en un proyecto de C#

    Fíjate en el detalle de que antes de mostrar el diseñador de formularios aparece un mensaje indicando algo como Opening the file… si eso se muestra… ¡es prácticamente seguro que el fallo va a ocurrir!

     

    Y esto es todo… a ver si lo solucionan.

    Lo que si es cierto es que hay más cosas que pasan, aparte de que escribas código y se pierda o se quede la ventana de código en blanco, ya que también me ocurre que estando en el diseñador de formularios no se muestra la ventana de propiedades y tengo que cambiar a otra pestaña o cerrar y abrir el formulario para que por fin se muestre la ventana de propiedades o que al estar en la ventana de propiedades, en el despegable donde indica qué control estás mostrando esté en blanco y aún así se muestren algunas propiedades… esto último me pasó en el proyecto de C# para .NET Core 3.1 en el que tenía seleccionado un botón que quería moverlo o cambiar el valor de la propiedad Anchor y al no mostrarse esa propiedad pensé que en .NET Core 3.1 no existía esa propiedad… y no, era que fallaba la ventana de propiedades.

    Si te ha ocurrido algo de esto, por favor indícalo en la página esa de Developer Community en la que he publicado el fallo (la descripción del problema está en inglés), te repito el enlace para que te sea más cómodo:

    When opening a project if I modify the code and then (without saving) I show the form, when returning to the code that code does not exist (any changes made are not shown).

    Es un título largo, lo sé… pero… 😉

    Gracias.

    Nos vemos.
    Guillermo

  • gsCompilarNET: una biblioteca de clases para compilar código de C# o VB

    Pues eso… intentando convertir la utilidad de Compilar y ejecutar a .NET 5.0 (Preview 8) me topé que (si no recuerdo mal) el .NET 5.0 no ofrece las clases para compilar (Microsoft.CodeDom.Providers.DotNetCompilerPlatform), así que… me puse a buscar en la web y me topé con un código de ejemplo (en C#) de Laurent Kempé que estaba escrito usando .NET Core 3.0 Preview 2.

    Me puse a copiar el código que tenía publicado en el artículo y lo modifiqué para crear un proyecto para .NET Core 3.1 que usara las clases de compilar y ejecutar (Compiler y Runner) desde otra clase estática que es la encargada de llamar compilar y ejecutar el código. Después descubrí que ese código lo tenía publicado en GitHub, pero en realidad ya lo tenía copiado/adaptado usando el código de su web.

    El problema inicial con el que me encontré es que solo compilaba código de C#, así que… lo modifiqué para que también compilara código de Visual Basic.

    En principio ese código solo compilaba/ejecutaba código de consola. Así que… tuve que modificarlo para que también compilara código de Windows Forms, eso sí, todo el código debía estar en un solo fichero.

    La respuesta a esto último que me dio la idea de cómo solucionarlo (o casi) la encontré en la red, pero no recuerdo en qué página, solo sé que era para ejecutar código de Visual Basic contenido en una base de datos, pero en realidad no era para código de Windows Forms, si no de consola, pero eso me sirvió para (además de agregar las referencias necesarias) poder crear el fichero json que necesita dotnet para crear el tipo adecuado de aplicación o usar las bibliotecas necesarias, la verdad es que tampoco me enteré demasiado… solo que haciéndolo, funcionaba 😉

    La cuestión es que conseguí hacer operativo el compilador para usar código de Visual Basic (y C#) tanto para consola como para formularios de Windows.

    Este es el código (o parte) que hace que esto sea posible:

            ' para ejecutar una DLL usando dotnet, necesitamos un fichero de configuración
            Dim jsonFile = Path.ChangeExtension(outputExe, "runtimeconfig.json")
            Dim jsonText = ""
            If compiler.EsWinForm Then
                Dim version = Compiler.WindowsDesktopApp().Version
                ' Aplicación de escritorio (Windows Forms)
                ' Microsoft.WindowsDesktop.App
                ' 5.0.0-preview.8.20411.6
                jsonText = "
    {
        ""runtimeOptions"": {
        ""tfm"": ""net5.0-windows"",
        ""framework"": {
            ""name"": ""Microsoft.WindowsDesktop.App"",
            ""version"": """ & version & """
        }
        }
    }"
            Else
                Dim version = Compiler.NETCoreApp().Version
                ' Tipo consola
                ' Microsoft.NETCore.App
                ' 5.0.0-preview.8.20407.11
                jsonText = "
    {
        ""runtimeOptions"": {
        ""tfm"": ""net5.0"",
        ""framework"": {
            ""name"": ""Microsoft.NETCore.App"",
            ""version"": """ & version & """
        }
        }
    }"
            End If
            Using sw = New StreamWriter(jsonFile, False, Encoding.UTF8)
                sw.WriteLine(jsonText)
            End Using
    

    Hoy me ha dado por convertir el código de C# (ya modificado y operativo) a Visual Basic y he creado un «repositorio» en GitHub con el código de la DLL que he creado para compilar código.

    También he publicado el código de la versión de C#, ya que actualmente tengo las dos versiones sincronizadas (es decir, los cambios y mejoras que he añadido en VB los he pasado al proyecto de C# y viceversa).

    Así que… si te interesa el código de esta DLL para compilar puedes descargarlo/verlo en el repositorio de GitHub para gsCompilarNET.

    Después publicaré también la utilidad de .NET 5.0 para Windows Forms que utiliza esa DLL (y la de gsColorearNET).

     

    Espero que te sea de utilidad. 🙂

    Nos vemos.
    Guillermo

    P.S.
    He publicado en NuGet la utilidad ya compilada por si quieres usarla en tus proyectos de Visual Studio (final o preview):
    gsCompilarNET en NuGet.

    P.S.2
    Esta es la pagina original de Compilar y ejecutar en elGuille.info (para .NET Framework 4.7.2 usando WPF).

  • Compilar código en .NET Core (.NET 5.0) para consola y Windows Forms

    Pues eso… usando la aplicación que te mostré el otro día (Compilar y ejecutar versión para .NET Core (.NET 5.0)) y después de hacer varias pruebas con otra DLL que compila el código y lo ejecuta sin usar Process.Start, al menos si es una aplicación de consola, (ya que para ejecutar las de Windows Forms, al menos hasta lo que yo he probado, solo puedo lanzarla usando Process.Start); al final me he quedado con la llamada a dotnet para crear el proyecto, compilarlo y ejecutar el código compilado.

    Nota:
    Abajo te dejo un ZIP con el código fuente del proyecto (Compilar y ejecutar) y la utilidad para colorear (gsColorearCore).
    En la carpeta pruebas del proyecto está el código fuente (de VB y C#) de la aplicación de ejemplo.

    Compilar con dotnet (desde la línea de comandos)

    En las primeras pruebas (las del código que te puse en el post arriba mencionado, usaba aplicaciones de consola, más que nada porque así se lo decía al usar el comando:

    dotnet new console -o "AppDir" -lang c#|vb

    Ese código lo que hace es crear una aplicación de consola en el directorio indicado por AppDir (si ya existe, podemos añadir –force al final para que genere el contenido aunque sobreesciba lo que ya hubiese.).

    Para crear/compilar una aplicación para Windows Forms tendremos que usar una línea de comandos parecida a la anterior, pero indicando winforms en vez de console.
    En el siguiente código creamos una aplicación de .NET 5.0 Core usando Visual Basic en el directorio E:\Guille\source\repos\MiAppWinF.

    Nota:
    Si no tienes instalado el .NET 5.0 y tienes al menos el .NET Core 3.0 o 3.1 simplemente usa el lenguaje C# en lugar de Visual Basic, ya que en esas versiones anteriores al 5.0 solo se permiten aplicaciones de Windows Forms o WPF para C#.

    dotnet new winforms -o "E:\Guille\source\repos\MiAppWinF" -lang vb

    Nota:
    En realidad poner el directorio entre comillas dobles no es necesario, salvo que se utilice el comando dotnet build.

    Una vez hecho esto, solo tendremos que modificar el código generado y si queremos que se ejecute el contenido de ese directorio podemos usa la siguiente línea de comandos:

    dotnet run -p E:\Guille\source\repos\MiAppWinF

    El código usado en la aplicación Compilar y ejecutar NETCore

    En el código de la aplicación compilar y ejecutar para .NET Core 5.0 este último paso me lo salto y lo que hago es crear la aplicación (con –force) sustituyo el código. ya que –force o simplemente al crear con new se generan los ficheros en blanco (sin el código que ya tuviera).
    En su lugar utilizo build para compilar el código.
    Es decir, creo la aplicación con new (uso –force por si ya existiera), guardo el código fuente del editor del programa, lo compilo con build y finalmente lo ejecuto usando Process.Start.

    El comando build usado es el siguiente:

    dotnet build "E:\Guille\source\repos\MiAppWinF"

    Las comillas dobles solo son necesarias si el path o el nombre del proyecto contiene espacios.

    Y ese comando habrá creado un ejecutable (aparte de la DLL que siempre genera .NET Core) en el directorio: E:\Guille\source\repos\MiAppWinF\bin\Debug\net5.0-windows cuyo nombre será MiAppWinF.exe
    Fíjate que al ser una aplicación para Windows (las aplicaciones de Windows Forms y las de WPF solo se pueden usar en plataformas Windows, es decir, no se pueden usar ni en Linux ni en MacOS) se crea en un directorio aparte de las aplicaciones de consola, que sería en: bin\Debug\net5.0\

    Nota:
    El directorio de salida puede ser diferente si antes de build (y después de new) cambias la configuración del proyecto.

    Un poco de código fuente por favor

    El código del método compilar al que se le pasa el código a compilar/ejecutar.

    ''' <summary>
    ''' Compilar el código indicado en el parámetro.
    ''' 
    ''' Usando dotnet (.NET Core) se hará lo siguiente:
    ''' Definir un directorio para VB o C#: MiApp_VB o MiApp_CS
    ''' Usar el comando:
    ''' dotnet new console -o dir -lang C#|VB --force
    ''' Copiar en ese directorio el fichero como Program.vb o .cs
    ''' Usar el comando (y redirigir la salida):
    ''' dotnet run -p dir
    ''' </summary>
    Private Sub compilar(texto As String, mostrarSoloSalida As Boolean)
        ' Compilar usando la línea de comandos
        Dim ext = If(optCS.IsChecked, "cs", "vb")
    
        Dim appDir = System.IO.Path.Combine(System.Environment.CurrentDirectory,
                                            $"MiApp_{ext}")
    
        ' crear un fichero temporal para compilar
        Dim ficProgram = Path.Combine(appDir, $"Program.{ext}")
    
        Dim dotnet = "dotnet"
        Dim args = "--version"
        txtSalida.Text = $"{dotnet} {args} = {ejecutar(dotnet, args, waitSecs:=5000)}"
    
        ' Considero que es aplicación de Windows Forms              (07/Sep/20)
        ' si contiene InitializeComponent
        Dim esWF = texto.IndexOf("InitializeComponent()") > -1
        If esWF Then
            args = $"new winforms -o ""{appDir}"" -lang {If(optCS.IsChecked, "c#", "vb")} --force"
        Else
            args = $"new console -o ""{appDir}"" -lang {If(optCS.IsChecked, "c#", "vb")} --force"
        End If
    
        If mostrarSoloSalida Then
            ejecutar(dotnet, args, waitSecs:=10000)
        Else
            txtSalida.Text &= $"{vbCrLf}{vbCrLf}{ejecutar(dotnet, args, waitSecs:=10000)}"
        End If
    
        ' Eliminar todos los ficheros del lenguaje
        ' (solo quedará el que se guarde)
        Dim files = Directory.GetFiles(appDir, $"*.{ext}")
        For i = 0 To files.Length - 1
            File.Delete(files(i))
        Next
    
        ' Guardar el código a compilar
        Using sw As New System.IO.StreamWriter(ficProgram,
                                               False,
                                               System.Text.Encoding.UTF8)
            sw.Write(texto)
        End Using
    
        args = $"build ""{appDir}"""
    
        If mostrarSoloSalida Then
            Dim res = ejecutar(dotnet, args, waitSecs:=10000)
            Dim hayErrorComp = False
            If optVB.IsChecked Then
                If res.Contains("error BC") Then
                    hayErrorComp = True
                End If
            Else
                If res.Contains("error CS") Then
                    hayErrorComp = True
                End If
            End If
            If hayErrorComp Then
                txtSalida.Text &= vbCrLf & res
                txtSalida.Text &= $"{vbCrLf}--- FIN DE LA COMPILACIÓN CON ERRORES ---"
                Return
            End If
            'txtSalida.Text &= $"{vbCrLf}{vbCrLf}{res}"
        Else
            txtSalida.Text &= $"{vbCrLf}{vbCrLf}{ejecutar(dotnet, args, waitSecs:=10000)}"
        End If
    
        Dim exe = System.IO.Path.Combine(appDir, $"bin\Debug\net5.0\MiApp_{ext}.exe")
        ' Si es aplicación de Windows Forms, usa otro directorio    (07/Sep/20)
        If esWF Then
            'net5.0-windows
            exe = System.IO.Path.Combine(appDir, $"bin\Debug\net5.0-windows\MiApp_{ext}.exe")
            txtSalida.Text &= $"{vbCrLf}{vbCrLf}Aplicación de Windows"
        End If
        txtSalida.Text &= $"{vbCrLf}{vbCrLf}{ejecutar(exe, esWinF:=esWF)}"
    
        txtSalida.Text &= $"{vbCrLf}--- FIN DE LA COMPILACIÓN ---"
    
        txtSalida.SelectionStart = txtSalida.Text.Length
        txtSalida.SelectionLength = 0
    End Sub
    

    Del método ejecutar tengo dos versiones, la primera es la que uso para llamar al dotnet y en el que redirijo la salida de la consola para capturarla y mostrarla en la caja de textos txtSalida.
    Al primero le paso el nombre de la aplicación a ejecutar (dotnet) y los argumentos.
    Al segundo le paso el nombre del ejecutable y si es o no aplicación de Windows, en cuyo caso se usa ShellExecute y el estilo de la ventana es normal, aparte de no usar Kill para que no se cierre la aplicación al poco de haberse abierto 🙂

    Private Function ejecutar(exe As String, arg As String,
                              Optional conKill As Boolean = False,
                              Optional waitSecs As Integer = 10000) As String
        Dim res = ""
        Using p As New Process
            p.StartInfo.FileName = exe
            p.StartInfo.Arguments = arg
    
            ' Indicamos que queremos redirigir la salida
            p.StartInfo.RedirectStandardOutput = True
            ' Para redirigir la salida, UseShellExecute debe ser falso
            p.StartInfo.UseShellExecute = False
    
            p.StartInfo.CreateNoWindow = True
    
            Try
                ' Iniciamos el proceso
                p.Start()
    
                ' Esperar a que el proceso finalice
                '
                ' Esperamos waitSecs segundos para que le de tiempo a ejecutarse
                ' como mínimo esperar 2000 (o 5000 si se usa dotnet)
                If waitSecs < 2000 Then waitSecs = 2000
                p.WaitForExit(waitSecs)
    
                If conKill Then
                    p.Kill()
                End If
    
                res = p.StandardOutput.ReadToEnd()
            Catch ex As Exception
    
                res = ex.Message
            End Try
        End Using
    
        Return res
    End Function
    
    ''' <summary>
    ''' Ejecutar el código y mostrarlo en la ventana de salida.
    ''' </summary>
    Private Function ejecutar(exe As String,
                              Optional waitSecs As Integer = 2000,
                              Optional esWinF As Boolean = False) As String
        Dim p As New Process
    
        p.StartInfo.FileName = exe
    
        If esWinF Then
    
            With p.StartInfo
                .UseShellExecute = True
                .WindowStyle = ProcessWindowStyle.Normal
            End With
    
            ' Iniciamos el proceso
            p.Start()
    
            ' Esperar a que el proceso finalice
            '
            ' Esperamos 2 segundos para que le de tiempo a ejecutarse
            ' Como mínimo 2 segundos
            If waitSecs < 2000 Then waitSecs = 2000
            p.WaitForExit(waitSecs)
    
            Return ""
        End If
    
        ' Indicamos que queremos redirigir la salida
        p.StartInfo.RedirectStandardOutput = True
        ' Para redirigir la salida, UseShellExecute debe ser falso
        p.StartInfo.UseShellExecute = False
    
        ' No usar esto
        ' salvo que se use p.Kill()
        p.StartInfo.CreateNoWindow = True
    
        ' Iniciamos el proceso
        p.Start()
    
        ' Esperar a que el proceso finalice
        '
        ' Esperamos 2 segundos para que le de tiempo a ejecutarse
        ' Como mínimo 2 segundos
        If waitSecs < 2000 Then waitSecs = 2000
        p.WaitForExit(waitSecs)
        Try
            p.Kill()
        Catch ex As Exception
            Debug.WriteLine(ex.Message)
        End Try
    
        ' Convertir la salida usando el código de página 437
        ' que es la usada en MS-DOS (línea de comandos)
        Dim res = p.StandardOutput.ReadToEnd()
    
        Return res
    End Function
    

    Recomendación para usar código de Windows Forms en la utilidad de Compilar y ejecutar

    Por último, comentarte que si quieres compilar una app para Windows Forms desde la utilidad de compilar y ejecutar, el código de esa aplicación debe estar en un solo fichero, en el que te recomiendo que incluyas el método Main, la definición del diseñador de Windows Forms y el código que realmente quieres usar.
    Esto es así porque el programa/utilidad no está preparado para usar múltiples ficheros.

    Te muestro a continuación cómo sería ese código para Visual Basic y para C# y una captura de la salida realizada al compilar desde la utilidad.

    Este es el código de Visual Basic del formulario de pruebas.

    Imports System
    Imports System.Windows.Forms
    
    '
    ' El punto de entrada del programa
    '
    
    Friend Module Program
    
        <STAThread()>
        Friend Sub Main(args As String())
            Application.SetHighDpiMode(HighDpiMode.SystemAware)
            Application.EnableVisualStyles()
            Application.SetCompatibleTextRenderingDefault(False)
            Application.Run(New Form1)
        End Sub
    
    End Module
    
    '
    ' El diseñador del formulario
    '
    
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Partial Class Form1
        Inherits System.Windows.Forms.Form
    
        'Form overrides dispose to clean up the component list.
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
    
        'Required by the Windows Form Designer
        Private components As System.ComponentModel.IContainer
    
        'NOTE: The following procedure is required by the Windows Form Designer
        'It can be modified using the Windows Form Designer.  
        'Do not modify it using the code editor.
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            Me.TextBox1 = New System.Windows.Forms.TextBox()
            Me.Button1 = New System.Windows.Forms.Button()
            Me.Label1 = New System.Windows.Forms.Label()
            Me.Button2 = New System.Windows.Forms.Button()
            Me.SuspendLayout()
            '
            'TextBox1
            '
            Me.TextBox1.Location = New System.Drawing.Point(12, 12)
            Me.TextBox1.Name = "TextBox1"
            Me.TextBox1.Size = New System.Drawing.Size(182, 23)
            Me.TextBox1.TabIndex = 0
            '
            'Button1
            '
            Me.Button1.Location = New System.Drawing.Point(200, 11)
            Me.Button1.Name = "Button1"
            Me.Button1.Size = New System.Drawing.Size(75, 23)
            Me.Button1.TabIndex = 1
            Me.Button1.Text = "Button1"
            Me.Button1.UseVisualStyleBackColor = True
            '
            'Label1
            '
            Me.Label1.Location = New System.Drawing.Point(12, 38)
            Me.Label1.Name = "Label1"
            Me.Label1.Size = New System.Drawing.Size(263, 23)
            Me.Label1.TabIndex = 2
            Me.Label1.Text = "Label1"
            '
            'Button2
            '
            Me.Button2.Location = New System.Drawing.Point(200, 90)
            Me.Button2.Name = "Button2"
            Me.Button2.Size = New System.Drawing.Size(75, 23)
            Me.Button2.TabIndex = 3
            Me.Button2.Text = "Cerrar"
            Me.Button2.UseVisualStyleBackColor = True
            '
            'Form1
            '
            Me.AcceptButton = Me.Button1
            Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 15.0!)
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.CancelButton = Me.Button2
            Me.ClientSize = New System.Drawing.Size(287, 125)
            Me.Controls.Add(Me.Button2)
            Me.Controls.Add(Me.Label1)
            Me.Controls.Add(Me.Button1)
            Me.Controls.Add(Me.TextBox1)
            Me.Name = "Form1"
            Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
            Me.Text = "Form1"
            Me.ResumeLayout(False)
            Me.PerformLayout()
    
        End Sub
    
        Friend WithEvents TextBox1 As TextBox
        Friend WithEvents Button1 As Button
        Friend Label1 As Label
        Friend Button2 As Button
    End Class
    
    '
    ' El código del formulario
    '
    
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            TextBox1.Text = "<tu nombre>"
    
            'AddHandler Button2.Click, AddressOf Button2_Click
            AddHandler Button2.Click, Sub() Me.Close()
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim str = TextBox1.Text
            If str = "<tu nombre>" Then
                str = " amigo"
            End If
            Label1.Text = $"¡Hola {ToUpperFirst(str)}!"
        End Sub
    
        ''' <summary>
        ''' Convierte en mayúsculas el primer carácter de la cadena indicada.
        ''' </summary>
        Private Function ToUpperFirst(str As String) As String
            'Return str(0).ToString().ToUpper() & str.Substring(1)
            if str="" then str=" amigo"
            Return str(0).ToString.ToUpper & str.Substring(1)
        End Function
    
        'Private Sub Button2_Click(sender As Object, e As EventArgs)
        '    Me.Close()
        'End Sub
    End Class
    

    Este es el código de C# del formulario de pruebas.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    
    //
    // El punto de entrada del programa
    //
    
    static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
    
    
    //
    // El diseñador del formulario
    //
    
    partial class Form1
    {
        /// <summary>
        ///  Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
    
        /// <summary>
        ///  Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    
        #region Windows Form Designer generated code
    
        /// <summary>
        ///  Required method for Designer support - do not modify
        ///  the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.button2 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(12, 12);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(182, 23);
            this.textBox1.TabIndex = 0;
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(200, 12);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 1;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // label1
            // 
            this.label1.Location = new System.Drawing.Point(12, 38);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(263, 23);
            this.label1.TabIndex = 2;
            this.label1.Text = "label1";
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(200, 90);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(75, 23);
            this.button2.TabIndex = 3;
            this.button2.Text = "Cerrar";
            this.button2.UseVisualStyleBackColor = true;
            //this.button2.Click += new System.EventHandler(this.button1_Click);
            // 
            // Form1
            // 
            this.AcceptButton = this.button1;
            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.CancelButton = this.button2;
            this.ClientSize = new System.Drawing.Size(287, 125);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button2);
            this.Name = "Form1";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.PerformLayout();
    
        }
    
        #endregion
    
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Button button2;
    }
    
    //
    // El código del formulario
    //
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = "<tu nombre>";
            
            //button2.Click += => (object o, EventArgs e) this.Close();
            //button2.Click += delegate (object sender, EventArgs e) { this.Close(); };
            button2.Click += (sender, e) => { this.Close(); };
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            //label1.Text = $"Hola {ToUpperFirst(textBox1.Text)}!";
            var str = textBox1.Text;
            if( str == "<tu nombre>" ) str = " amigo";
            label1.Text = $"Hola {ToUpperFirst(str)}!";
        }
    
        /// <summary>
        /// Convierte en mayúsculas el primer carácter de la cadena indicada.
        /// </summary>
        private string ToUpperFirst(string str)
        {
            if(str=="") str = " amigo";
            return str[0].ToString().ToUpper() + str.Substring(1);
        }
    }
    

    Esta es la salida del código ejecutándose con la utilidad de compilar y ejecutar para NETCore.

    Figura 1. El resultado de compilar y ejecutar una aplicación de Windows Forms para .NET Core 5.0.

    Y esto es todo… tengo algo más por ahí, para seguir con la compilación y ejecución del código para .NET Core, pero eso será para otra ocasión 🙂

     

    Espero que te haya sido de utilidad… Esa es la idea y ¡eso espero! 🙂

     

    Nos vemos.
    Guillermo

    El ZIP con el código fuente:

    ZIP: Compilar_ejecutar_NetCore_20200908_1551.zip (71.8 KB)
    MD5 checksum: 52A9AD9A1F1605547D1C8451CADD4CF0