Поделиться через


Переход с классического приложения на UWP

Если у вас есть существующее классическое приложение, которое было создано с помощью .NET Framework (включая WPF и Windows Forms) или API Win32 C++, вы можете перейти на универсальную платформу Windows (UWP) и Windows 10/11.

Упакуйте настольное приложение в пакет MSIX

Вы можете упаковать настольное приложение в пакет MSIX, чтобы получить доступ к многочисленным функциям Windows 10 и Windows 11. MSIX — это современный формат пакета приложений Windows, предоставляющий универсальный интерфейс упаковки для всех приложений Windows, включая UWP, WPF, Windows Forms и Win32. Упаковка классических приложений Windows в пакетах MSIX позволяет получить доступ к надежной установке и обновлению, управляемой модели безопасности с гибкой системой возможностей, поддержкой Microsoft Store, корпоративным управлением и множеством пользовательских моделей распространения. Вы можете упаковыть приложение независимо от того, есть ли исходный код или есть только существующий файл установщика (например, MSI или установщик App-V). После упаковки приложения можно интегрировать функции UWP, такие как расширения пакетов и другие компоненты UWP.

Для получения дополнительной информации см. статьи Создание пакета MSIX из кода и Требуемые для удостоверения пакета функции.

Использование API среды выполнения Windows

Вы можете напрямую вызывать множество API среды выполнения Windows в классических настольных приложениях WPF, Windows Forms или C++ Win32, чтобы интегрировать современные возможности, доступные для пользователей Windows 10. Например, можно вызвать API среды выполнения Windows, чтобы добавить тост-уведомления в настольное приложение.

Дополнительные сведения см. в статье Использование API среды выполнения Windows в классических приложениях.

Перенос приложения .NET Framework в приложение UWP

Если приложение работает на платформе .NET Framework, его можно перенести в приложение UWP, используя .NET Standard 2.0. Переместите столько кода, сколько можно сделать в библиотеки классов .NET Standard 2.0, а затем создайте приложение UWP, которое ссылается на библиотеки .NET Standard 2.0.

Общий доступ к коду в библиотеке .NET Standard 2.0

Если приложение работает в .NET Framework, поместите столько кода, сколько можно сделать в библиотеки классов .NET Standard 2.0. Если код использует API, определенные в стандарте, его можно повторно использовать в приложении UWP. Проще, чем когда-либо, совместно использовать код в библиотеке .NET Standard, поскольку в .NET Standard 2.0 включено значительно больше API.

Вот видео, которое рассказывает вам больше об этом.

Добавление библиотек .NET Standard

Сначала добавьте в решение одну или несколько библиотек классов .NET Standard.

Добавление проекта dotnet standard

Количество библиотек, добавляемых в решение, зависит от того, как вы планируете упорядочить код.

Убедитесь, что каждая библиотека классов предназначена для .NET Standard 2.0.

Поддерживает .NET Standard 2.0

Этот параметр можно найти на страницах свойств проекта библиотеки классов.

В проекте классического приложения добавьте ссылку на проект библиотеки классов.

снимок экрана панели обозревателя решений, которая вызывает ссылку на библиотеку классов для проекта dot NET.

Затем используйте средства, чтобы определить, сколько из кода соответствует стандарту. Таким образом, перед перемещением кода в библиотеку можно решить, какие части можно повторно использовать, какие части требуют минимального изменения и какие части останутся конкретными приложениями.

Проверка совместимости библиотеки и кода

Начнем с пакетов Nuget и других dll-файлов, полученных от стороннего производителя.

Если приложение использует любой из них, определите, совместимы ли они с .NET Standard 2.0. Для этого можно использовать расширение Visual Studio или служебную программу командной строки.

Используйте эти же средства для анализа кода. Скачайте здесь средства (dotnet-apiport) и просмотрите это видео, чтобы узнать, как их использовать.  

Если код не совместим со стандартом, рассмотрите другие способы реализации этого кода. Начните с открытия браузера API .NET. Этот браузер можно использовать для просмотра API, доступных в .NET Standard 2.0. Убедитесь, что список соответствует стандарту .NET Standard 2.0.

Параметр dot net

Некоторая часть вашего кода будет зависеть от платформы и должна оставаться в проекте настольного приложения.

Пример. Перенос кода доступа к данным в библиотеку .NET Standard 2.0

Предположим, что у нас есть очень простое приложение Windows Forms, показывающее клиентов из примера базы данных Northwind.

приложение Windows Forms

Проект содержит библиотеку классов .NET Standard 2.0 со статическим классом с именем Northwind. Если мы переместим этот код в класс Northwind, он не будет компилироваться, так как он использует классы SQLConnection, SqlCommandи SqlDataReader и те классы, которые недоступны в .NET Standard 2.0.

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

    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString = ...; // Your connection string goes here.

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

Мы можем использовать браузер .NET API, чтобы найти альтернативу. Классы DbConnection, DbCommandи DbDataReader доступны в .NET Standard 2.0, чтобы использовать их вместо этого.

В этой обновленной версии эти классы используются для получения списка клиентов, но для создания класса DbConnection необходимо передать объект фабрики, который мы создадим в клиентском приложении.

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

    using (DbConnection conn = factory.CreateConnection())
    {
        conn.ConnectionString = ...; // Your connection string goes here.

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

На странице кода в Windows Form можно просто создать экземпляр фабрики и передать его в наш метод.

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

Создание приложения UWP

Теперь вы готовы добавить приложение UWP в решение.

на настольном компьютере изображение моста для UWP

Вам по-прежнему придется разрабатывать страницы пользовательского интерфейса в XAML и писать любой код устройства или платформы, но при завершении вы сможете достичь полной ширины устройств Windows 10 и Windows 11, а страницы приложений будут иметь современное ощущение, что хорошо адаптируется к разным размерам экрана и разрешениям.

Приложение будет реагировать на механизмы ввода, отличные от клавиатуры и мыши, а функции и параметры будут интуитивно понятными на разных устройствах. Это означает, что пользователи учатся делать вещи один раз, а затем он работает очень знакомым способом независимо от устройства.

Это всего лишь несколько преимуществ, которые предоставляются с UWP. Дополнительные сведения см. в статье Создание отличных возможностей в Windows.

Добавление проекта UWP

Сначала добавьте проект UWP в решение.

проекта UWP

Затем из проекта UWP добавьте ссылку на проект библиотеки .NET Standard 2.0.

снимок экрана панели обозревателя решений UWP, где выделена ссылка на библиотеку классов для проекта .NET.

Создайте свои страницы

Добавьте страницы XAML и вызовите код в библиотеке .NET Standard 2.0.

приложения 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);
    }
}

Чтобы приступить к работе с UWP, см. Что такое приложение UWP.

Дальнейшие шаги

Найти ответы на вопросы

У вас есть вопросы? Спросите нас в Stack Overflow. Наша команда следит за этими тегами. Вы также можете задать нам вопросы здесь.