Las plantillas de C# usan el arranque de aplicación

En consonancia con los cambios relacionados en las cargas de trabajo de .NET, las plantillas de Windows Forms para C# se han actualizado a fin de admitir directivas global using, espacios de nombres con ámbito de archivo y tipos de referencia que aceptan valores NULL. Dado que una aplicación típica de Windows Forms consta de varios tipos divididos en varios archivos (por ejemplo, Form1.cs y Form1.Designer.cs), las instrucciones de nivel superior no están presentes en las plantillas de Windows Forms. Sin embargo, las plantillas actualizadas incluyen el código de arranque de la aplicación. Esto puede producir incompatibilidad si tiene como destino una versión anterior de .NET.

Versión introducida

.NET 6 RC 1

Comportamiento anterior

Un punto de entrada de la aplicación de Windows Forms tenía este aspecto:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyApp
{
    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());
        }
    }
}

Comportamiento nuevo

El nuevo punto de entrada de una aplicación de .NET 6 y versiones posteriores tiene el aspecto siguiente:

namespace MyApp;

static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        ApplicationConfiguration.Initialize();
        Application.Run(new Form1());
    }
}

ApplicationConfiguration.Initialize() es una API efímera producida por el compilador Roslyn (a través de generadores de origen). Este método emite las mismas llamadas que tenían las plantillas originales. Para configurar el comportamiento de esta API, establezca las propiedades MSBuild siguientes:

Si no configura ninguna propiedad explícitamente, el código siguiente se ejecuta en tiempo de ejecución:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        // ApplicationConfiguration.Initialize() will emit the following calls:
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.SetHighDpiMode(HighDpiMode.SystemAware);

        Application.Run(new Form1());
    }
}

Cambio de categoría

Este cambio afecta a la compatibilidad de origen.

Motivo del cambio

La característica de arranque de la aplicación:

  • Permite al diseñador de Windows Forms representar la superficie de diseño en la fuente de su preferencia.
  • Reduce el código reutilizable en las plantillas.

Si se usa el mismo origen para compilar una aplicación destinada a varios TFM, puede realizar una de las acciones siguientes:

  • Reemplazar la llamada a ApplicationConfiguration.Initialize(); por el código original (y perder la compatibilidad del diseñador con la API Application.SetDefaultFont).

  • Usar directivas #if...#endif, por ejemplo:

    #if NET6_0_OR_GREATER
            ApplicationConfiguration.Initialize();
    #else
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
    #endif
    

API afectadas

N/D