Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Если у вас есть существующее классическое приложение, которое было создано с помощью .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.
Количество библиотек, добавляемых в решение, зависит от того, как вы планируете упорядочить код.
Убедитесь, что каждая библиотека классов предназначена для .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, он не будет компилироваться, так как он использует классы 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 в решение.
Вам по-прежнему придется разрабатывать страницы пользовательского интерфейса в 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.
Дальнейшие шаги
Найти ответы на вопросы
У вас есть вопросы? Спросите нас в Stack Overflow. Наша команда следит за этими тегами. Вы также можете задать нам вопросы здесь.