Использование Windows App SDK в приложении Windows Forms (WinForms)

Windows App SDK является следующим развитием платформы разработки приложений для Windows. Но в этом разделе показано, как можно использовать WINDOWS APP SDK API (и среда выполнения Windows API) в приложении Windows Forms (WinForms).

  • Во многих случаях вам потребуется повторно создать приложение WinForms в виде приложения Библиотеки пользовательского интерфейса Windows 3 (WinUI 3). Одним из преимуществ перехода на WinUI 3 является доступ к система Fluent Design (см. также проектирование и код приложений Для Windows). WinUI 3 является частью Windows App SDK, поэтому, естественно, приложение WinUI 3 может использовать и другие функции Windows App SDK и API. В этом разделе не рассматривается процесс переноса приложения WinForms в WinUI 3.
  • Но если вы обнаружите, что используете функции WinForms, которые еще не доступны в WinUI 3, вы по-прежнему можете использовать Windows App SDK функции (например, жизненный цикл приложения, MRT Core, DWriteCore и другие) в приложении WinForms. Дале показано, как это сделать.

И если у вас еще нет проекта WinForms или вы хотите попрактиковаться в этом процессе, в этом разделе содержатся шаги по созданию проекта WinForms, чтобы вы могли следовать инструкциям и настроить его для вызова API Windows App SDK.

Предварительные требования

  1. Установка инструментов для Windows App SDK.
  2. В этом разделе рассматриваются как неупакованные, так и упакованные приложения WinForms. Если приложение WinForms не упаковывается (приложения WinForms по умолчанию являются приложениями WinForms), убедитесь, что все зависимости для неупакованных приложений установлены (см. руководство по развертыванию Windows App SDK для приложений, зависимых от платформы, упакованных с внешним расположением или неупакованных приложений). Чтобы быстро сделать это, перейдите в раздел Последние загрузки для Windows App SDK, а затем скачайте и распакуйте и запустите один из стабильных загрузок среды выполнения выпуска.

Важно!

Версия среды выполнения , которую вы устанавливаете, должна соответствовать версии пакета NuGet Microsoft.WindowsAppSDK , который вы установите на следующем шаге.

Дополнительные сведения о неупакованных и упакованных терминах см. в статье Преимущества и недостатки упаковки приложения.

Создайте проект WinForms, если у вас его еще нет

Если у вас уже есть проект WinForms, можно перейти к следующему разделу.

  1. В Visual Studio создайте проект приложения C# Windows Forms (проект .NET). Будьте внимательны, чтобы выбрать шаблон проекта с точным именем Windows Forms App, а не Windows Forms App (платформа .NET Framework).
  2. Присвойте проекту имя и примите все параметры по умолчанию.

Теперь у вас есть проект, который создает неупакованное приложение WinForms.

Настройка проекта WinForms для поддержки Windows App SDK

Сначала мы изменим файл проекта.

  1. В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Изменить файл проекта.

  2. Этот шаг позволяет вызывать API среда выполнения Windows (WinRT) (включая API Windows App SDK). Внутри элемента PropertyGroup находится элемент TargetFramework , для которого задано значение , например net6.0. Добавьте к значению целевой платформы моникер (в частности, моникер Целевой платформы). Например, используйте следующую команду, если ваше приложение предназначено для Windows 10 версии 2004:

    <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    
  3. Кроме того, в элемент PropertyGroup добавьте элемент RuntimeIdentifiers следующим образом:

    <RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
    
  4. По умолчанию приложение WinForms не упаковывается (это означает, что оно не устанавливается с помощью MSIX). Неупакованное приложение должно инициализировать среду выполнения Windows App SDK перед использованием любой другой функции Windows App SDK. Это можно сделать автоматически при запуске приложения с помощью автоматической инициализации. Вы просто задали WindowsPackageType (также внутри элемента PropertyGroup) свойство проекта соответствующим образом, как показано ниже:

    <WindowsPackageType>None</WindowsPackageType>
    

    Если у вас есть расширенные потребности (например, пользовательская обработка ошибок или загрузка определенной версии Windows App SDK), вместо автоматической инициализации можно явно вызывать API начального загрузчика. Дополнительные сведения см. в статье Использование среды выполнения Windows App SDK для приложений, упакованных с внешним расположением или неупакованных.

  5. Сохраните и закройте файл проекта.

Далее мы установим пакет NuGet Windows App SDK в проекте.

  1. В Обозреватель решений щелкните правой кнопкой мыши узел Зависимости проекта и выберите Управление пакетами NuGet....
  2. В окне Диспетчер пакетов NuGet перейдите на вкладку Обзор и установите последний стабильный пакет Microsoft.WindowsAppSDK.

Использование некоторых функций Windows App SDK в приложении WinForms

В этом разделе приведен очень простой пример вызова API Windows App SDK из приложения WinForms. В нем используется функция MRT Core (см. раздел Управление ресурсами с помощью MRT Core). Если этот пример подходит для вашего проекта WinForms (и если вы создали новый для этого пошагового руководства, то он будет), вы можете выполнить следующие действия.

  1. Откройте Form1.cs (с помощью команды Вид Designer) и перетащите кнопку и метку из панели элементов в конструктор.

  2. Дважды щелкните button1 , чтобы создать обработчик событий.

  3. Теперь мы добавим код, который использует класс ResourceManager в Windows App SDK для загрузки строкового ресурса.

    1. Добавьте в проект новый элемент Resources File (RESW) (оставьте имя по умолчанию Resources.resw).

    2. Открыв файл ресурсов в редакторе, создайте строковый ресурс со следующими свойствами.

      • Имя: Сообщение
      • Значение: Здравствуйте, ресурсы!
    3. Сохраните и закройте файл ресурсов.

    4. Откройте Form1.cs (с помощью команды Просмотреть код ) и измените обработчик событий следующим образом:

    private void button1_Click(object sender, EventArgs e)
    {
        // Construct a resource manager using the resource index generated during build.
        var manager =
            new Microsoft.Windows.ApplicationModel.Resources.ResourceManager();
    
        // Look up a string in the resources file using the string's name.
        label1.Text = manager.MainResourceMap.GetValue("Resources/Message").ValueAsString;
    }
    
  4. Выполните сборку проекта и запустите приложение. Нажмите кнопку, чтобы увидеть отображаемую строку Hello, resources! .

Совет

Если во время выполнения отображается окно сообщения, указывающее, что приложению требуется определенная версия среды выполнения приложений Windows, и вы спрашиваете, хотите ли вы установить ее сейчас, нажмите кнопку Да. Вы увидите последние загрузки для Windows App SDK. Дополнительные сведения см. в разделе Предварительные требования выше.

Дополнительные сведения о зависимости пакета Платформы, которую принимает приложение при использовании Windows App SDK, а также о дополнительных компонентах, необходимых для работы в неупакованном приложении, см. также в статье Архитектура среды выполнения.

Упаковка и развертывание приложения WinForms с помощью MSIX

Для некоторых функций и API Windows (включая API уведомлений Windows App SDK) требуется, чтобы у вашего приложения во время выполнения было удостоверение пакета (другими словами, приложение должно быть упаковано). Дополнительные сведения см. в разделе Функции, требующие удостоверения пакета.

  1. В Обозреватель решений в Visual Studio щелкните правой кнопкой мыши решение и выберите Добавить>новый проект....
  2. В диалоговом окне Добавление нового проекта выполните поиск по запросу упаковки, выберите шаблон проекта C# Проект упаковки приложений Windows и нажмите кнопку Далее.
  3. Назовите проект и нажмите кнопку Создать.
  4. Мы хотим указать, какие приложения в решении должны быть включены в пакет. Поэтому в проекте упаковки (а не в проекте WinForms) щелкните правой кнопкой мыши узел Зависимости и выберите Добавить ссылку на проект....
  5. В списке проектов в решении выберите проект WinForms и нажмите кнопку ОК.
  6. Разверните узелПриложениязависимостей> проекта упаковки и убедитесь, что ссылка на проект WinForms выделена полужирным шрифтом. Это означает, что он будет использоваться в качестве стартовой точки пакета.
  7. Щелкните правой кнопкой мыши проект упаковки и выберите Пункт Как запускаемый проект.
  8. Щелкните правой кнопкой мыши проект WinForms и выберите Изменить файл проекта.
  9. Удалите <WindowsPackageType>None</WindowsPackageType>, сохраните и закройте.
  10. В раскрывающемся списке Платформы решений выберите x64 (вместо Любой ЦП).
  11. Убедитесь, что вы можете выполнять сборку и запуск.

Теперь, когда вы упаковали приложение WinForms, вы можете вызывать API, для которых требуется удостоверение пакета. Поэтому откройте Form1.cs (с помощью команды Просмотреть код ) и измените обработчик событий следующим образом:

private void button1_Click(object sender, EventArgs e)
{
    var notification = new AppNotificationBuilder()
        .AddArgument("action", "viewConversation")
        .AddArgument("conversationId", "9813")
        .AddText("Andrew sent you a picture")
        .AddText("Check this out, The Enchantments in Washington!")
        .BuildNotification();

    AppNotificationManager.Default.Show(notification);
}

Выполните сборку и запустите еще раз. Нажмите кнопку и убедитесь, что отображается всплывающее уведомление. При вызове из процесса, в который отсутствует удостоверение пакета во время выполнения, API-интерфейсы уведомлений создают исключение.

Примечание

В этом разделе показано, как создать упакованое приложение. Альтернативой является создание упаковаемого приложения с внешним расположением. Напоминание обо всех этих терминах см. в статье Преимущества и недостатки упаковки приложения.