Переход с классического приложения на UWP
Если у вас есть существующее классическое приложение, созданное с помощью платформа .NET Framework (включая WPF и Windows Forms) или API Win32 на C++, вы можете перейти на универсальная платформа 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, так как так много api включены в .NET Standard 2.0.
Вот видео, которое рассказывает вам больше об этом.
Добавление библиотек .NET Standard
Сначала добавьте в решение одну или несколько библиотек классов .NET Standard.
Количество библиотек, добавляемых в решение, зависит от того, как вы планируете упорядочить код.
Убедитесь, что каждая библиотека классов предназначена для .NET Standard 2.0.
Этот параметр можно найти на страницах свойств проекта библиотеки классов.
В проекте классического приложения добавьте ссылку на проект библиотеки классов.
Затем используйте средства, чтобы определить, сколько из кода соответствует стандарту. Таким образом, перед перемещением кода в библиотеку можно решить, какие части можно повторно использовать, какие части требуют минимального изменения и какие части останутся конкретными приложениями.
Проверка совместимости библиотеки и кода
Начнем с пакетов Nuget и других dll-файлов, полученных от стороннего производителя.
Если приложение использует любой из них, определите, совместимы ли они с .NET Standard 2.0. Для этого можно использовать расширение Visual Studio или служебную программу командной строки.
Используйте эти же средства для анализа кода. Скачайте здесь средства (dotnet-apiport), а затем просмотрите это видео, чтобы узнать, как их использовать.
Если код не совместим со стандартом, рассмотрите другие способы реализации этого кода. Начните с открытия браузера API .NET. Этот браузер можно использовать для просмотра API, доступных в .NET Standard 2.0. Не забудьте ограничить список .NET Standard 2.0.
Некоторые из кода будут зависят от платформы и должны оставаться в проекте классического приложения.
Пример. Перенос кода доступа к данным в библиотеку .NET Standard 2.0
Предположим, что у нас есть очень простое приложение Windows Forms, показывающее клиентов из примера базы данных Northwind.
Проект содержит библиотеку классов .NET Standard 2.0 со статическим классом с именем Northwind. Если мы переместим этот код в класс Northwind, он не будет компилироваться, так как он использует SqlCommand
SQLConnection
классы и 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;
}
Мы можем использовать браузер API .NET, чтобы найти альтернативу, хотя. DbCommand
Классы DbConnection
и 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 в решение.
Вам по-прежнему придется разрабатывать страницы пользовательского интерфейса в XAML и писать любой код устройства или платформы, но при завершении вы сможете достичь полной ширины устройств Windows 10 и Windows 11, а страницы приложений будут иметь современное ощущение, что хорошо адаптируется к разным размерам экрана и разрешениям.
Приложение будет реагировать на механизмы ввода, отличные от клавиатуры и мыши, а функции и параметры будут интуитивно понятными на разных устройствах. Это означает, что пользователи учатся делать вещи один раз, а затем он работает очень знакомым способом независимо от устройства.
Это всего лишь несколько хороших, которые приходят с UWP. Дополнительные сведения см. в статье "Создание отличных возможностей с Windows".
Добавление проекта UWP
Сначала добавьте проект UWP в решение.
Затем из проекта UWP добавьте ссылку на проект библиотеки .NET Standard 2.0.
Создание страниц
Добавьте страницы XAML и вызовите код в библиотеке .NET Standard 2.0.
<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.
Эти проекты позволяют использовать C# для создания приложений Android и iOS с полным доступом к API для конкретной платформы и устройств. Эти приложения используют аппаратное ускорение для конкретной платформы и компилируются для собственной производительности.
Они имеют доступ к полному спектру функциональных возможностей, предоставляемых базовой платформой и устройством, включая такие возможности, как iBeacons и Фрагменты Android, и вы будете использовать стандартные собственные элементы управления пользовательского интерфейса для создания интерфейсов, которые выглядят и чувствуют, как пользователи ожидают их.
Как и для UWPs, стоимость добавления приложения Android или iOS ниже, так как вы можете повторно использовать бизнес-логику в библиотеке классов .NET Standard 2.0. Вам потребуется разработать страницы пользовательского интерфейса в XAML и написать любой код устройства или платформы.
Добавление проекта Xamarin
Сначала добавьте в решение проект Android, iOS или Кроссплатформенный проект.
Эти шаблоны можно найти в диалоговом окне "Добавление нового проекта" в группе Visual C#.
Примечание.
Кроссплатформенные проекты отлично подходят для приложений с небольшими функциональными возможностями для конкретной платформы. Их можно использовать для создания собственного пользовательского интерфейса на основе XAML, работающего в iOS, Android и Windows. Подробнее см. здесь.
Затем из проекта Android, iOS или кроссплатформенного проекта добавьте ссылку на проект библиотеки классов.
Создание страниц
В нашем примере показан список клиентов в приложении 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. Наша команда следит за этими тегами. Вы также можете задать нам вопросы здесь.