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

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

Упаковка классического приложения в пакет MSIX

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

Дополнительные сведения см. в разделах Создание пакета MSIX на основе кода и Функции, требующие удостоверения пакета.

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

Для интеграции современных возможностей, которые могут заинтересовать пользователей Windows 10, большинство API-интерфейсов среды выполнения Windows можно вызывать напрямую из классических приложений WPF, Windows Forms или C++ Win32. Например, вы можете вызывать 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 2.0 входит гораздо больше API-интерфейсов, поэтому совместное использование кода в библиотеках .NET Standard стало еще удобнее.

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

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

Прежде всего, добавьте в вашей решение одну или несколько библиотек классов .NET Standard.

Добавление стандартного проекта dotnet

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

Убедитесь, что целевым объектом каждой библиотеки классов является .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 =
            @"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;
}

Мы можем использовать обозреватель API-интерфейсов .NET для получения альтернативного варианта. Классы 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 = @"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;
}

На странице с кодом программной части 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, которая вызывает ссылку на ссылку на библиотеку классов для проекта dot 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.

Доступ к устройствам iOS и Android

Получить доступ к устройствам Android и iOS можно путем добавления проектов Xamarin.

Примечание

Для новых кроссплатформенных проектов рекомендуется использовать .NET MAUI.

Изображение, показывающее устройство Android и устройство i O S с приложениями Xamarin.

С помощью этих проектов можно использовать C# для создания приложений Android и iOS с полным доступом к API-интерфейсам для конкретных платформ и устройств. Эти приложения используют средства аппаратного ускорения с учетом конкретной платформы и компилируются для достижения естественной производительности.

У них есть доступ ко всем функциям, предоставленным базовыми платформой и устройством, включая возможности конкретных платформ, такие как маяки iBeacon и фрагменты Android. Кроме того, вы сможете использовать стандартные собственные элементы управления для создания пользовательского интерфейса, оформление и возможности которого будут соответствовать ожиданиям пользователей.

Как и в случае с приложениями UWP, стоимость добавления приложения Android или iOS ниже благодаря возможности многократно использовать бизнес-логику в библиотеке классов .NET Standard 2.0. Необходимо спроектировать страницы пользовательского интерфейса в XAML и написать код для конкретного устройства или платформы.

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

Прежде всего, добавьте в решение проект Android, iOS или Межплатформенный проект.

Эти шаблоны находятся в диалоговом окне Добавление нового проекта в группе Visual C#.

Снимок экрана: диалоговое окно

Примечание

Межплатформенные проекты подходят для приложений с минимальным набором возможностей для конкретных платформ. Эти проекты можно использовать для создания единого собственного пользовательского интерфейса на основе XAML, который будет работать в iOS, Android и Windows. Дополнительные сведения см. здесь.

Затем добавьте ссылку на проект библиотеки классов через проект Android, iOS или межплатформенный проект.

Снимок экрана: панель Обозреватель решений, которая вызывает ссылку на справочник по библиотеке классов для android, i O S или кроссплатформенного проекта.

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

В нашем примере показан список пользователей в приложении Android.

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

Инструкции по началу работы с проектами Android, iOS и межплатформенными проектами см. на портале Xamarin для разработчиков.

Дальнейшие действия

Получение ответов на вопросы

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