Passare da un'applicazione desktop a una piattaforma UWP

Se si dispone di un'applicazione desktop esistente compilata usando .NET Framework (inclusi WPF e Windows Form) o le API Win32 C++, sono disponibili diverse opzioni per il passaggio alla piattaforma UWP (Universal Windows Platform) (UWP) e a Windows 10/11.

Crea il pacchetto della tua applicazione desktop in un pacchetto MSIX

Puoi creare un pacchetto dell'applicazione desktop in un pacchetto MSIX per ottenere l'accesso a molte altre funzionalità di Windows 10 e Windows 11. MSIX è un formato di pacchetto moderno che fornisce un'esperienza universale per tutte le app di Windows, tra cui UWP, WPF, Windows Forms e Win32. L'inserimento delle app desktop di Windows in pacchetti MSIX assicura un'esperienza superiore di installazione e aggiornamento, oltre a offrire un modello di sicurezza gestito con un sistema di funzionalità flessibile, il supporto per Microsoft Store, funzionalità di gestione aziendale e molti modelli di distribuzione personalizzati. È possibile creare un pacchetto dell'applicazione indipendentemente dal fatto che sia presente il codice sorgente o si dispone solo di un file di installazione esistente, ad esempio un programma di installazione MSI o App-V. Dopo aver creato il pacchetto dell'applicazione, puoi integrare funzionalità UWP, ad esempio estensioni del pacchetto e altri componenti UWP.

Per altre informazioni, vedere Creazione di un pacchetto MSIX dal codice e funzionalità che richiedono l'identità del pacchetto.

Utilizzare API di Windows Runtime

Nell'app desktop WPF, Windows Forms o Win32 C++ puoi chiamare direttamente molte API di Windows Runtime per integrare esperienze moderne e illuminanti per gli utenti di Windows 10. Puoi ad esempio chiamare le API di Windows Runtime per aggiungere notifiche di tipo avviso popup all'app desktop.

Per altre informazioni, vedi Usare le API di Windows Runtime nelle app desktop.

Eseguire la migrazione di un'app .NET Framework a un'app UWP

Se l'applicazione viene eseguita in .NET Framework, è possibile eseguirne la migrazione a un'app UWP sfruttando .NET Standard 2.0. Spostare tutto il codice possibile nelle librerie di classi .NET Standard 2.0 e quindi creare un'app UWP che faccia riferimento alle librerie .NET Standard 2.0.

Condividere il codice in una libreria .NET Standard 2.0

Se l'applicazione viene eseguita in .NET Framework, inserire tutto il codice possibile nelle librerie di classi .NET Standard 2.0. Finché il codice usa le API definite nello standard, puoi riutilizzarlo in un'app UWP. È più semplice di quanto non sia mai stato condividere il codice in una libreria .NET Standard perché molte altre API sono incluse in .NET Standard 2.0.

Ecco un video che ti dice di più su di esso.

Aggiungere librerie .NET Standard

Aggiungere prima di tutto una o più librerie di classi .NET Standard alla soluzione.

Aggiungere un progetto standard dotnet

Il numero di librerie aggiunte alla soluzione dipende dal modo in cui si prevede di organizzare il codice.

Assicurarsi che ogni libreria di classi sia destinata a .NET Standard 2.0.

Destinazione .NET Standard 2.0

È possibile trovare questa impostazione nelle pagine delle proprietà del progetto di libreria di classi.

Dal progetto dell'applicazione desktop aggiungere un riferimento al progetto di libreria di classi.

Screenshot del riquadro Esplora soluzioni che chiama il riferimento alla libreria di classi per il progetto dot NET.

Usare quindi gli strumenti per determinare la quantità di codice conforme allo standard. In questo modo, prima di spostare il codice nella libreria, è possibile decidere quali parti è possibile riutilizzare, quali parti richiedono modifiche minime e quali parti rimarranno specifiche dell'applicazione.

Controllare la compatibilità della libreria e del codice

Si inizierà con i pacchetti Nuget e altri file DLL ottenuti da terze parti.

Se l'applicazione li usa, determinare se sono compatibili con .NET Standard 2.0. A tale scopo, è possibile usare un'estensione di Visual Studio o un'utilità della riga di comando.

Usare questi stessi strumenti per analizzare il codice. Scaricare gli strumenti qui (dotnet-apiport) e quindi guardare questo video per informazioni su come usarli.  

Se il codice non è compatibile con lo standard, prendere in considerazione altri modi in cui è possibile implementare tale codice. Per iniziare, aprire il Browser API .NET. È possibile usare tale browser per esaminare le API disponibili in .NET Standard 2.0. Assicurarsi di definire l'ambito dell'elenco in .NET Standard 2.0.

opzione dot net

Alcuni codici saranno specifici della piattaforma e dovranno rimanere nel progetto dell'applicazione desktop.

Esempio: Migrazione del codice di accesso ai dati a una libreria .NET Standard 2.0

Si supponga di avere un'applicazione Windows Forms molto semplice che mostra i clienti del database di esempio Northwind.

App Windows Form

Il progetto contiene una libreria di classi .NET Standard 2.0 con una classe statica denominata Northwind. Se si sposta questo codice nella classe Northwind, non verrà compilato perché usa le SQLConnectionclassi SqlCommande SqlDataReader e quelle non disponibili in .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;
}

È possibile usare il Browser API .NET per trovare un'alternativa. Le classi DbConnection DbCommande DbDataReader sono tutte disponibili in .NET Standard 2.0, in modo da poterle usare.

Questa versione modificata usa queste classi per ottenere un elenco di clienti, ma per creare una classe DbConnection è necessario passare un oggetto factory creato nell'applicazione client.

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;
}

Nella pagina code-behind di Windows Forms è sufficiente creare un'istanza factory e passarla al metodo.

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);
        }
    }
}

Creare un'app UWP

A questo punto è possibile aggiungere un'app UWP alla soluzione.

immagine del bridge da desktop a UWP

Dovrai ancora progettare pagine dell'interfaccia utente in XAML e scrivere qualsiasi codice specifico della piattaforma o del dispositivo, ma al termine potrai raggiungere l'intera gamma di dispositivi Windows 10 e Windows 11 e le pagine delle tue app avranno un aspetto moderno che si adatta bene alle diverse dimensioni e risoluzioni dello schermo.

L'app risponderà ai meccanismi di input diversi da una tastiera e un mouse e le funzionalità e le impostazioni saranno intuitive nei dispositivi. Ciò significa che gli utenti imparano a eseguire le operazioni una sola volta e quindi funzionano in modo molto familiare indipendentemente dal dispositivo.

Questi sono solo alcuni dei buoni che sono dotati di UWP. Per altre informazioni, vedere Creare esperienze eccezionali con Windows.

Aggiungere un progetto UWP

Aggiungere prima di tutto un progetto UWP alla soluzione.

Progetto UWP

Quindi, dal progetto UWP aggiungere un riferimento al progetto di libreria .NET Standard 2.0.

Screenshot del riquadro di Esplora soluzioni UWP che chiama il riferimento alla libreria di classi di riferimento per il progetto dot NET.

Costruisci le tue pagine

Aggiungere pagine XAML e chiamare il codice nella libreria .NET Standard 2.0.

App 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);
    }
}

Per iniziare a usare la piattaforma UWP, vedi Che cos'è un'app UWP.

Raggiungi i dispositivi iOS e Android

È possibile raggiungere i dispositivi Android e iOS aggiungendo progetti Xamarin.

Nota

Per i nuovi progetti multipiattaforma, prendere in considerazione l'uso di .NET MAUI.

Immagine che mostra un dispositivo Android e un dispositivo I O S che visualizza le app Xamarin.

Questi progetti consentono di usare C# per compilare app Android e iOS con accesso completo alle API specifiche della piattaforma e specifiche del dispositivo. Queste app sfruttano l'accelerazione hardware specifica della piattaforma e vengono compilate per prestazioni native.

Hanno accesso all'intero spettro di funzionalità esposte dalla piattaforma e dal dispositivo sottostanti, comprese funzionalità specifiche della piattaforma come iBeacon e frammenti Android e utilizzerai i controlli dell'interfaccia utente nativa standard per creare interfacce utente che abbiano l'aspetto e la sensazione che gli utenti si aspettano.

Proprio come gli UWP, il costo per aggiungere un'app Android o iOS è inferiore perché è possibile riutilizzare la logica di business in una libreria di classi .NET Standard 2.0. Dovrai progettare le pagine dell'interfaccia utente in XAML e scrivere qualsiasi codice specifico della piattaforma o del dispositivo.

Aggiungere un progetto Xamarin

Aggiungere prima di tutto un progetto Android, iOS o Multipiattaforma alla soluzione.

È possibile trovare questi modelli nella finestra di dialogo Aggiungi nuovo progetto nel gruppo Visual C#.

Screenshot della finestra di dialogo Aggiungi nuovo progetto che mostra le opzioni Installed > Visual C sharp selezionate e Android, Cross Platform e i O S evidenziate.

Nota

I progetti multipiattaforma sono ideali per le app con funzionalità poco specifiche della piattaforma. È possibile usarli per creare un'interfaccia utente nativa basata su XAML eseguita in iOS, Android e Windows. Altre informazioni qui.

Quindi, dal progetto Android, iOS o multipiattaforma, aggiungere un riferimento al progetto di libreria di classi.

Screenshot del riquadro Esplora soluzioni che chiama il riferimento alla libreria di classi di riferimento per il progetto Android, i O S o multipiattaforma.

Costruisci le tue pagine

L'esempio mostra un elenco di clienti in un'app Android.

App 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);
    }
}

Per iniziare a usare progetti Android, iOS e multipiattaforma, vedere il portale per sviluppatori Xamarin.

Passaggi successivi

Trova le risposte alle tue domande

Altre domande? Partecipa a Stack Overflow. Il nostro team controlla costantemente questi tag. Puoi inviarci le tue domande anche qui.