Pasar de una aplicación de escritorio a UWP

Si tiene una aplicación de escritorio existente que se creó con .NET Framework (incluido WPF y Windows Forms) o las API win32 de C++, tiene varias opciones para pasar a la Plataforma universal de Windows (UWP) y Windows 10/11.

Empaquetar la aplicación de escritorio en un paquete MSIX

Puedes empaquetar la aplicación de escritorio en un paquete MSIX para obtener acceso a muchas más características de Windows 10 y Windows 11. MSIX es un formato moderno de paquete de la aplicación de Windows que proporciona una experiencia de empaquetado universal para todas las aplicaciones de Windows, incluidas las aplicaciones de UWP, WPF, Windows Forms y Win32. El empaquetado de las aplicaciones de escritorio de Windows en paquetes MSIX le permite acceder a una sólida experiencia de instalación y actualización, a un modelo de seguridad administrado con un sistema de funcionalidades flexible, a compatibilidad con Microsoft Store, a la administración empresarial y a muchos modelos de distribución personalizados. Puede empaquetar la aplicación tanto si tiene el código fuente como si solo tiene un archivo de instalador existente (por ejemplo, un instalador MSI o App-V). Después de empaquetar la aplicación, puedes integrar características de UWP, como extensiones de paquete y otros componentes de UWP.

Para obtener más información, consulte Creación de un paquete MSIX a partir del código y características que requieren la identidad del paquete.

Uso de api de Windows Runtime

Puedes llamar a muchas API de Windows Runtime directamente en la aplicación de escritorio de WPF, Windows Forms o Win32 de C++ para integrar las experiencias más actuales creadas para los usuarios de Windows 10. Por ejemplo, puedes llamar a las API de Windows Runtime para agregar notificaciones del sistema a la aplicación de escritorio.

Para obtener más información, consulta Uso de API de Windows Runtime para aplicaciones de escritorio.

Migración de una aplicación de .NET Framework a una aplicación para UWP

Si la aplicación se ejecuta en .NET Framework, puede migrarla a una aplicación para UWP aprovechando .NET Standard 2.0. Mueva tanto código como pueda a las bibliotecas de clases de .NET Standard 2.0 y, a continuación, cree una aplicación para UWP que haga referencia a las bibliotecas de .NET Standard 2.0.

Uso compartido de código en una biblioteca de .NET Standard 2.0

Si la aplicación se ejecuta en .NET Framework, coloque tanto código como pueda en las bibliotecas de clases de .NET Standard 2.0. Siempre que el código use las API definidas en el estándar, puede reutilizarla en una aplicación para UWP. Es más fácil de lo que nunca ha sido compartir código en una biblioteca de .NET Standard porque muchas más API se incluyen en .NET Standard 2.0.

En este vídeo se explica más sobre el tema.

Adición de bibliotecas de .NET Standard

En primer lugar, agregue una o varias bibliotecas de clases de .NET Standard a la solución.

Adición de un proyecto estándar de dotnet

El número de bibliotecas que agregue a la solución depende de cómo planee organizar el código.

Asegúrese de que cada biblioteca de clases tiene como destino .NET Standard 2.0.

Destino de .NET Standard 2.0

Puede encontrar este valor en las páginas de propiedades del proyecto de biblioteca de clases.

En el proyecto de aplicación de escritorio, agregue una referencia al proyecto de biblioteca de clases.

Captura de pantalla del panel Explorador de soluciones que llama a la referencia de la biblioteca de clases para el proyecto dot NET.

A continuación, use herramientas para determinar la cantidad de código que se ajusta al estándar. De este modo, antes de mover el código a la biblioteca, puede decidir qué partes puede reutilizar, qué partes requieren una modificación mínima y qué partes seguirán siendo específicas de la aplicación.

Comprobación de la compatibilidad de la biblioteca y el código

Comenzaremos con paquetes Nuget y otros archivos dll que obtuvo de un tercero.

Si la aplicación usa cualquiera de ellos, determine si son compatibles con .NET Standard 2.0. Puede usar una extensión de Visual Studio o una utilidad de línea de comandos para hacerlo.

Use estas mismas herramientas para analizar el código. Descargue las herramientas aquí (dotnet-apiport) y, a continuación, watch este vídeo para aprender a usarlos.  

Si el código no es compatible con el estándar, tenga en cuenta otras formas de implementar ese código. Para empezar, abra el explorador de API de .NET. Puede usar ese explorador para revisar las API que están disponibles en .NET Standard 2.0. Asegúrese de limitar el ámbito de la lista a .NET Standard 2.0.

dot net option

Algunos de los códigos serán específicos de la plataforma y deberán permanecer en el proyecto de aplicación de escritorio.

Ejemplo: Migración del código de acceso a datos a una biblioteca de .NET Standard 2.0

Supongamos que tenemos una aplicación de Windows Forms muy básica que muestra a los clientes de nuestra base de datos de ejemplo Northwind.

Aplicación de Windows Forms

El proyecto contiene una biblioteca de clases de .NET Standard 2.0 con una clase estática denominada Northwind. Si se mueve este código a la clase Northwind , no se compilará porque usa las SQLConnectionclases , SqlCommandy y SqlDataReader esas clases que no están disponibles en .NET Standard 2.0.

public static ArrayList GetCustomerNames()
{
    ArrayList customers = new ArrayList();

    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString =
            @"Data Source=" +
            @"<Your Server Name>\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI";

        conn.Open();

        SqlCommand command = new SqlCommand("select ContactName from customers order by ContactName asc", conn);

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                customers.Add(reader[0]);
            }
        }
    }

    return customers;
}

Sin embargo, podemos usar el explorador de API de .NET para buscar una alternativa. Las DbConnectionclases , DbCommandy DbDataReader están disponibles en .NET Standard 2.0 para que podamos usarlas en su lugar.

Esta versión revisada usa esas clases para obtener una lista de clientes, pero para crear una DbConnection clase, es necesario pasar un objeto de fábrica que creamos en la aplicación cliente.

public static ArrayList GetCustomerNames(DbProviderFactory factory)
{
    ArrayList customers = new ArrayList();

    using (DbConnection conn = factory.CreateConnection())
    {
        conn.ConnectionString = @"Data Source=" +
                        @"<Your Server Name>\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI";

        conn.Open();

        DbCommand command = factory.CreateCommand();
        command.Connection = conn;
        command.CommandText = "select ContactName from customers order by ContactName asc";

        using (DbDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                customers.Add(reader[0]);
            }
        }
    }

    return customers;
}

En la página de código subyacente de Windows Form, solo podemos crear una instancia de fábrica y pasarla al método .

public partial class Customers : Form
{
    public Customers()
    {
        InitializeComponent();

        dataGridView1.Rows.Clear();

        SqlClientFactory factory = SqlClientFactory.Instance;

        foreach (string customer in Northwind.GetCustomerNames(factory))
        {
            dataGridView1.Rows.Add(customer);
        }
    }
}

Creación de una aplicación UWP

Ahora ya está listo para agregar una aplicación para UWP a la solución.

imagen de puente de escritorio a UWP

Todavía tendrás que diseñar páginas de interfaz de usuario en XAML y escribir cualquier dispositivo o código específico de la plataforma, pero cuando hayas terminado, podrás llegar a toda la amplitud de los dispositivos Windows 10 y Windows 11 y las páginas de la aplicación tendrán una sensación moderna que se adapta bien a diferentes tamaños y resoluciones de pantalla.

La aplicación responderá a mecanismos de entrada distintos de un teclado y un mouse, y las características y la configuración serán intuitivas en todos los dispositivos. Esto significa que los usuarios aprenden a hacer cosas una vez y, a continuación, funcionan de una manera muy familiar, independientemente del dispositivo.

Estos son solo algunos de los buenos que vienen con UWP. Para más información, consulte Compilación de excelentes experiencias con Windows.

Agregar un proyecto de UWP

En primer lugar, agregue un proyecto de UWP a la solución.

Proyecto de UWP

A continuación, desde el proyecto de UWP, agregue una referencia al proyecto de biblioteca de .NET Standard 2.0.

Captura de pantalla del panel Explorador de soluciones de UWP que llama a la referencia a la referencia de la biblioteca de clases para el proyecto de dot NET.

Compilación de las páginas

Agregue páginas XAML y llame al código en la biblioteca de .NET Standard 2.0.

Aplicación para UWP

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel x:Name="customerStackPanel">
        <ListView x:Name="customerList"/>
    </StackPanel>
</Grid>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        SqlClientFactory factory = SqlClientFactory.Instance;

        customerList.ItemsSource = Northwind.GetCustomerNames(factory);
    }
}

Para empezar a trabajar con UWP, consulta ¿Qué es una aplicación para UWP?

Cobertura de dispositivos iOS y Android

Puede acceder a dispositivos Android e iOS agregando proyectos de Xamarin.

Nota:

Para nuevos proyectos multiplataforma, considere la posibilidad de usar .NET MAUI.

Imagen que muestra un dispositivo Android y un dispositivo i O S que muestra aplicaciones de Xamarin.

Estos proyectos permiten usar C# para compilar aplicaciones android e iOS con acceso completo a las API específicas de la plataforma y específicas del dispositivo. Estas aplicaciones aprovechan la aceleración de hardware específica de la plataforma y se compilan para el rendimiento nativo.

Tienen acceso al espectro completo de funcionalidades expuestas por la plataforma y el dispositivo subyacentes, incluidas las funcionalidades específicas de la plataforma, como iBeacons y fragmentos de Android, y usará controles de interfaz de usuario nativo estándar para crear interfaces de usuario nativas que parecen y sienten la forma en que los usuarios esperan que se vean.

Al igual que los UWP, el costo de agregar una aplicación Android o iOS es menor porque puede reutilizar la lógica de negocios en una biblioteca de clases de .NET Standard 2.0. Tendrás que diseñar tus páginas de interfaz de usuario en XAML y escribir cualquier dispositivo o código específico de la plataforma.

Adición de un proyecto de Xamarin

En primer lugar, agregue un proyecto android, iOS o multiplataforma a la solución.

Puede encontrar estas plantillas en el cuadro de diálogo Agregar nuevo proyecto en el grupo Visual C# .

Captura de pantalla del cuadro de diálogo Agregar nuevo proyecto en el que se muestran las opciones Resaltadas de Visual C instaladas > y Android, Multiplataforma e I O S resaltadas.

Nota:

Los proyectos multiplataforma son excelentes para las aplicaciones con poca funcionalidad específica de la plataforma. Puedes usarlos para crear una interfaz de usuario nativa basada en XAML que se ejecute en iOS, Android y Windows. Obtenga más información aquí.

A continuación, desde el proyecto Android, iOS o multiplataforma, agregue una referencia al proyecto de biblioteca de clases.

Captura de pantalla del panel de Explorador de soluciones que llama a la referencia a la referencia de la biblioteca de clases para el proyecto Android, i O S o multiplataforma.

Compilación de las páginas

En nuestro ejemplo se muestra una lista de clientes en una aplicación android.

Aplicación de Android

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp" android:textSize="16sp"
    android:id="@android:id/list">
</TextView>
[Activity(Label = "MyAndroidApp", MainLauncher = true)]
public class MainActivity : ListActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SqlClientFactory factory = SqlClientFactory.Instance;

        var customers = (string[])Northwind.GetCustomerNames(factory).ToArray(typeof(string));

        ListAdapter = new ArrayAdapter<string>(this, Resource.Layout.list_item, customers);
    }
}

Para empezar a trabajar con proyectos android, iOS y multiplataforma, consulte el portal para desarrolladores de Xamarin.

Pasos siguientes

Encontrar respuestas a tus preguntas

¿Tienes alguna pregunta? Pregúntanos en Stack Overflow. Nuestro equipo supervisa estas etiquetas. También puedes preguntarnos aquí.