Compartir a través de


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 entre varios archivos, por ejemplo, Form1.cs y Form1.Designer.cs, las instrucciones de nivel superior están especialmente ausentes de las plantillas de Windows Forms. Sin embargo, las plantillas actualizadas incluyen código de arranque de la aplicación. Esto puede provocar 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 aplicación de Windows Forms tiene el siguiente 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());
        }
    }
}

Nuevo comportamiento

El nuevo punto de entrada de aplicación para una aplicación de .NET 6+ tiene este aspecto:

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 de Roslyn (a través de generadores de origen). Este método emite las mismas llamadas que tenían las plantillas originales. Puede configurar el comportamiento de esta API estableciendo las siguientes propiedades de MSBuild:

Si no configura explícitamente ninguna propiedad, 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());
    }
}

Cambiar 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 preferida.
  • 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:

  • Reemplace la llamada ApplicationConfiguration.Initialize(); por el código original (y perderá el soporte del diseñador para la API Application.SetDefaultFont).

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

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

Las APIs afectadas

No disponible