Wechseln von einer Desktopanwendung zu UWP

Wenn Sie über eine vorhandene Desktopanwendung verfügen, die mit der .NET Framework (einschließlich WPF und Windows Forms) oder C++-Win32-APIs erstellt wurde, haben Sie mehrere Optionen für den Wechsel zur Universelle Windows-Plattform (UWP) und Windows 10/11.

Packen Ihrer Desktopanwendung in einem MSIX-Paket

Sie können Ihre Desktopanwendung in ein MSIX-Paket packen, um Zugriff auf viele weitere Windows 10 und Windows 11 Features zu erhalten. MSIX ist ein modernes Windows-App-Paketformat, bei dem eine universelle Verpackungsoberfläche für alle Windows-Apps bereitgestellt wird, z. B. UWP-, WPF-, Windows Forms- und Win32-Apps. Durch das Verpacken Ihrer Windows-Desktop-Apps in MSIX-Paketen erhalten Sie Zugriff auf eine stabile Installations- und Aktualisierungsoberfläche, ein verwaltetes Sicherheitsmodell mit einem flexiblen Funktionssystem, Support für den Microsoft Store, Unternehmensverwaltung und viele benutzerdefinierte Distributionsmodelle. Sie können Ihre Anwendung packen, unabhängig davon, ob Sie über den Quellcode verfügen oder nur über eine Installationsdatei (z. B. ein MSI- oder App-V-Installationsprogramm) verfügen. Nachdem Sie Ihre Anwendung verpackt haben, können Sie UWP-Features wie Paketerweiterungen und andere UWP-Komponenten integrieren.

Weitere Informationen finden Sie unter Erstellen eines MSIX-Pakets aus Ihrem Code und Features, die eine Paketidentität erfordern.

Verwenden Windows-Runtime-APIs

Sie können viele Windows-Runtime-APIs direkt in Ihrer WPF-, Windows Forms- oder C++-Win32-Desktop-App aufrufen, um moderne Benutzeroberflächen für Windows 10-Benutzer zu integrieren. Sie können beispielsweise Windows-Runtime-APIs aufrufen, um Ihrer Desktop-App Popupbenachrichtigungen hinzuzufügen.

Weitere Informationen finden Sie unter Verwenden von Windows-Runtime-APIs in Desktop-Apps.

Migrieren einer .NET Framework-App zu einer UWP-App

Wenn Ihre Anwendung auf dem .NET Framework ausgeführt wird, können Sie sie mithilfe von .NET Standard 2.0 zu einer UWP-App migrieren. Verschieben Sie so viel Code wie möglich in .NET Standard 2.0-Klassenbibliotheken, und erstellen Sie dann eine UWP-App, die auf Ihre .NET Standard 2.0-Bibliotheken verweist.

Freigeben von Code in einer .NET Standard 2.0-Bibliothek

Wenn Ihre Anwendung auf dem .NET Framework ausgeführt wird, platzieren Sie so viel Code wie möglich in .NET Standard 2.0-Klassenbibliotheken. Solange Ihr Code APIs verwendet, die im Standard definiert sind, können Sie ihn in einer UWP-App wiederverwenden. Es ist einfacher als je zuvor, Code in einer .NET Standard-Bibliothek freizugeben, da in .NET Standard 2.0 so viele weitere APIs enthalten sind.

Hier ist ein Video, in dem Sie mehr darüber erfahren.

Hinzufügen von .NET Standardbibliotheken

Fügen Sie ihrer Lösung zunächst mindestens eine .NET Standard-Klassenbibliothek hinzu.

Hinzufügen eines dotnet-Standardprojekts

Die Anzahl der Bibliotheken, die Sie Ihrer Lösung hinzufügen, hängt davon ab, wie Sie Ihren Code organisieren möchten.

Stellen Sie sicher, dass jede Klassenbibliothek auf .NET Standard 2.0 ausgerichtet ist.

Ziel .NET Standard 2.0

Sie finden diese Einstellung auf den Eigenschaftenseiten des Klassenbibliotheksprojekts.

Fügen Sie in Ihrem Desktopanwendungsprojekt einen Verweis auf das Klassenbibliotheksprojekt hinzu.

Screenshot des Projektmappen-Explorer Bereichs, in dem die Klassenbibliotheksreferenz für das dot NET-Projekt aufgerufen wird.

Verwenden Sie als Nächstes Tools, um zu bestimmen, wie viel Ihres Codes dem Standard entspricht. Auf diese Weise können Sie vor dem Verschieben von Code in die Bibliothek entscheiden, welche Teile wiederverwendet werden können, welche Teile nur eine minimale Änderung erfordern und welche Teile anwendungsspezifisch bleiben.

Überprüfen der Bibliotheks- und Codekompatibilität

Wir beginnen mit Nuget-Paketen und anderen DLL-Dateien, die Sie von einem Drittanbieter erhalten haben.

Wenn Ihre Anwendung eines davon verwendet, bestimmen Sie, ob sie mit .NET Standard 2.0 kompatibel sind. Dazu können Sie eine Visual Studio-Erweiterung oder ein Befehlszeilenprogramm verwenden.

Verwenden Sie dieselben Tools, um Ihren Code zu analysieren. Laden Sie die Tools hier herunter (dotnet-apiport), und watch Sie dann dieses Video, um zu erfahren, wie Sie sie verwenden können.  

Wenn Ihr Code nicht mit dem Standard kompatibel ist, erwägen Sie andere Möglichkeiten, diesen Code zu implementieren. Öffnen Sie zunächst den .NET-API-Browser. Sie können diesen Browser verwenden, um die API zu überprüfen, die in .NET Standard 2.0 verfügbar sind. Stellen Sie sicher, dass Sie die Liste auf .NET Standard 2.0 festlegen.

option dot net

Ein Teil Ihres Codes ist plattformspezifisch und muss in Ihrem Desktopanwendungsprojekt verbleiben.

Beispiel: Migrieren von Datenzugriffscode zu einer .NET Standard 2.0-Bibliothek

Angenommen, wir verfügen über eine sehr einfache Windows Forms-Anwendung, die Kunden aus unserer Northwind-Beispieldatenbank anzeigt.

Windows Forms-App

Das Projekt enthält eine .NET Standard 2.0-Klassenbibliothek mit einer statischen Klasse namens Northwind. Wenn wir diesen Code in die Northwind-Klasse verschieben, wird er nicht kompiliert, da die SQLConnectionKlassen , SqlCommandund sowie SqlDataReader die Klassen verwendet werden, die in .NET Standard 2.0 nicht verfügbar sind.

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

Wir können jedoch den .NET-API-Browser verwenden, um eine Alternative zu finden. Die DbConnectionKlassen , DbCommandund DbDataReader sind alle in .NET Standard 2.0 verfügbar, sodass wir sie stattdessen verwenden können.

Diese überarbeitete Version verwendet diese Klassen, um eine Liste von Kunden abzurufen. Zum Erstellen einer DbConnection Klasse müssen wir jedoch ein Factoryobjekt übergeben, das wir in der Clientanwendung erstellen.

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

Auf der CodeBehind-Seite von Windows Form können wir einfach factory instance erstellen und an unsere Methode übergeben.

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

Erstellen einer UWP-App

Jetzt können Sie Ihrer Lösung eine UWP-App hinzufügen.

Desktop-zu-UWP-Bridgeimage

Sie müssen weiterhin UI-Seiten in XAML entwerfen und geräte- oder plattformspezifischen Code schreiben, aber wenn Sie fertig sind, können Sie die gesamte Breite der Windows 10 und Windows 11 Geräte erreichen, und Ihre App-Seiten haben ein modernes Design, das sich gut an unterschiedliche Bildschirmgrößen und Auflösungen anpasst.

Ihre App reagiert auf andere Eingabemechanismen als nur auf Tastatur und Maus, und Features und Einstellungen sind geräteübergreifend intuitiv. Das bedeutet, dass Benutzer einmal lernen, dinge zu tun, und dann funktioniert es auf eine sehr vertraute Weise, unabhängig vom Gerät.

Dies sind nur einige der Goodies, die mit UWP kommen. Weitere Informationen finden Sie unter Erstellen von hervorragenden Erfahrungen mit Windows.

Hinzufügen eines UWP-Projekts

Fügen Sie zunächst ihrer Projektmappe ein UWP-Projekt hinzu.

UWP-Projekt

Fügen Sie dann aus Ihrem UWP-Projekt einen Verweis auf das .NET Standard 2.0-Bibliotheksprojekt hinzu.

Screenshot des Bereichs

Erstellen Ihrer Seiten

Fügen Sie XAML-Seiten hinzu, und rufen Sie den Code in Ihrer .NET Standard 2.0-Bibliothek auf.

UWP-App

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

Informationen zu den ersten Schritten mit UWP finden Sie unter Was ist eine UWP-App?

Erreichen von iOS- und Android-Geräten

Sie können Android- und iOS-Geräte erreichen, indem Sie Xamarin-Projekte hinzufügen.

Hinweis

Für neue plattformübergreifende Projekte erwägen Sie die Verwendung von .NET MAUI.

Ein Bild, das ein Android-Gerät und ein i O S-Gerät zeigt, auf dem Xamarin-Apps angezeigt werden.

Mit diesen Projekten können Sie C# verwenden, um Android- und iOS-Apps mit vollem Zugriff auf plattformspezifische und gerätespezifische APIs zu erstellen. Diese Apps nutzen plattformspezifische Hardwarebeschleunigung und werden für native Leistung kompiliert.

Sie haben Zugriff auf das gesamte Funktionsspektrum, das von der zugrunde liegenden Plattform und dem zugrunde liegenden Gerät verfügbar gemacht wird, einschließlich plattformspezifischer Funktionen wie iBeacons und Android Fragments, und Sie verwenden native Standardsteuerelemente der Benutzeroberfläche, um UIs zu erstellen, die so aussehen und sich anfühlen, wie sie von Benutzern erwartet werden.

Genau wie UWPs sind die Kosten für das Hinzufügen einer Android- oder iOS-App geringer, da Sie Geschäftslogik in einer .NET Standard 2.0-Klassenbibliothek wiederverwenden können. Sie müssen Ihre UI-Seiten in XAML entwerfen und geräte- oder plattformspezifischen Code schreiben.

Hinzufügen eines Xamarin-Projekts

Fügen Sie zunächst ihrer Lösung ein Android-, iOS- oder plattformübergreifendes Projekt hinzu.

Sie finden diese Vorlagen im Dialogfeld Neues Projekt hinzufügen unter der Gruppe Visual C# .

Screenshot des Dialogfelds Neues Projekt hinzufügen, in dem Die Optionen

Hinweis

Plattformübergreifende Projekte eignen sich hervorragend für Apps mit wenig plattformspezifischer Funktionalität. Sie können sie verwenden, um eine native XAML-basierte Benutzeroberfläche zu erstellen, die unter iOS, Android und Windows ausgeführt wird. Hiererhalten Sie weitere Informationen.

Fügen Sie dann aus Ihrem Android-, iOS- oder plattformübergreifenden Projekt einen Verweis auf das Klassenbibliotheksprojekt hinzu.

Screenshot des Projektmappen-Explorer Bereichs, in dem der Verweis auf die Referenz zur Klassenbibliothek für das Android-, i O S- oder plattformübergreifende Projekt aufgerufen wird.

Erstellen Ihrer Seiten

Unser Beispiel zeigt eine Liste von Kunden in einer Android-App.

Android-App

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

Informationen zu den ersten Schritten mit Android, iOS und plattformübergreifenden Projekten finden Sie im Xamarin-Entwicklerportal.

Nächste Schritte

Antworten auf deine Fragen

Haben Sie Fragen? Frage uns auf Stack Overflow. Unser Team überwacht diese Tags. Du kannst uns auch hier fragen.