Пошаговое руководство. Создание компонента C#/WinRT и его использование из C++/WinRT

C#/WinRT позволяет разработчикам с помощью .NET создавать собственные компоненты среда выполнения Windows в C# с помощью проекта библиотеки классов. Созданные компоненты можно использовать в собственных классических приложениях в качестве ссылки на пакет или как ссылку на проект с небольшими изменениями.

В этом пошаговом руководстве демонстрируется создание простого компонента среды выполнения Windows с помощью C#/WinRT, распространение компонента в виде пакета NuGet и использование компонента из консольного приложения C++/WinRT. Полный пример, в котором приведен код для этой статьи, см. в разделе Пример разработки C#/WinRT. Дополнительные сведения о разработке см. в разделе Разработка компонентов.

Пошаговое руководство по созданию элементов управления WinUI с помощью C#/WinRT специально для использования в приложениях пакета SDK для приложений для приложений для Приложений Для Windows см. в статье Пошаговое руководство. Создание компонента C# с помощью элементов управления WinUI 3 и использование из приложения пакета SDK для приложений для windows C++

Необходимые компоненты

Для выполнения данного пошагового руководства требуются следующие инструменты, средства и компоненты:

Создание простого компонента среды выполнения Windows с использованием C#/WinRT

Начните с создания проекта в Visual Studio. Выберите шаблон проекта библиотеки классов и назовите проект AuthoringDemo. Вам потребуется внести следующие дополнения и изменения в проект:

  1. Обновите TargetFramework в файле AuthoringDemo.csproj и добавьте следующие элементы в PropertyGroup:

    <PropertyGroup>
        <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
        <Platforms>x64</Platforms>
    </PropertyGroup>
    

    Чтобы получить доступ к типам среда выполнения Windows, необходимо задать определенную версию пакета SDK для Windows в TFM. Дополнительные сведения о поддерживаемой версии см. в разделе .NET 6 и более поздних версий. Используйте параметр TFM.

  2. Установите пакет NuGet Microsoft.Windows.CsWinRT в проекте.

    a. В обозревателе решений щелкните правой кнопкой мыши по проекту и выберите Управление пакетами NuGet.

    b. Найдите Microsoft.Windows.CsWinRT пакет NuGet и установите последнюю версию. В этом пошаговом руководстве используется C#/WinRT версии 1.4.1.

  3. Добавьте новый PropertyGroup элемент, который задает CsWinRTComponent свойство. Это указывает, что проект является компонентом среда выполнения Windows, чтобы .winmd файл был создан при сборке проекта.

    <PropertyGroup>   
        <CsWinRTComponent>true</CsWinRTComponent>
    </PropertyGroup>
    

    Полный список свойств проекта C#/WinRT см. в документации по пакету NuGet для C#/WinRT.

  4. Классы среды выполнения можно создавать с помощью файлов классов библиотеки .cs . Щелкните файл правой Class1.cs кнопкой мыши и переименуйте его Example.csв . Добавьте в этот файл следующий код, который добавляет открытое свойство и метод в класс среды выполнения. Не забудьте пометить все классы, которые вы хотите предоставить в компоненте среды выполнения как public.

    namespace AuthoringDemo
    {
        public sealed class Example
        {
            public int SampleProperty { get; set; }
    
            public static string SayHello()
            {
                return "Hello from your C# WinRT component";
            }
        }
    }
    
  5. Теперь вы можете создать проект для создания .winmd файла для компонента. Щелкните проект правой кнопкой мыши в Обозреватель решений и щелкните "Сборка". Вы увидите созданный AuthoringDemo.winmd файл в выходной папке сборки.

Создание пакета NuGet для компонента

Большинство разработчиков хотят распространять и предоставлять общий доступ к среда выполнения Windows компоненту в виде пакета NuGet. Другим вариантом является использование компонента в качестве ссылки на проект. Ниже показано, как упаковать компонент AuthoringDemo . При создании пакета C#/WinRT настраивает компоненты и сборки размещения в пакете для включения потребления из собственных приложений.

Создать пакет NuGet можно несколькими способами:

  • Если вы хотите создавать пакет NuGet каждый раз при сборке проекта, добавьте следующее свойство в файл AuthoringDemo проекта, затем выполните сборку повторно.

    <PropertyGroup>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    </PropertyGroup>
    
  • Кроме того, можно создать пакет NuGet, щелкнув правой кнопкой мыши по проекту AuthoringDemo в обозревателе решений и выбрав Пакет.

При выполнении сборки проекта, в окне Сборка должно быть указано, что пакет NuGet AuthoringDemo.1.0.0.nupkg был успешно создан. Дополнительные сведения о свойствах пакета NuGet с помощью интерфейса командной строки dotnet см. в статье "Создание пакета" с помощью интерфейса командной строки .NET.

Использование компонента из приложения C++/WinRT

Компоненты среда выполнения Windows C#/WinRT можно использовать на любом языке, совместимом с среда выполнения Windows (WinRT). Ниже показано, как вызвать указанный выше компонент в консольном приложении C++/WinRT.

Примечание.

Использование компонента C#/WinRT из приложений C#/.NET поддерживается, как ссылкой на пакет, так и ссылкой на проект. Этот сценарий эквивалентен использованию любой обычной библиотеки классов C# и в большинстве случаев не предусматривает активацию WinRT. Начиная с C#/WinRT 1.3.5, для ссылок на проекты для потребителей C# требуется .NET 6.

  1. Добавьте новый проект Консольное приложение C++/WinRT в свое решение. Обратите внимание, что этот проект также может быть частью другого решения, если вы выберите этот вариант.

    a. В обозревателе решений щелкните правой кнопкой мыши по узлу решения и выберите команду Добавить ->Новый проект.

    b. В диалоговом окне "Добавить новый проект", найдите шаблон проекта Консольное приложение C++/WinRT. Выберите шаблон и нажмите кнопку Далее.

    c. Присвойте проекту имя CppConsoleApp и нажмите Создать.

  2. Добавьте ссылку на компонент AuthoringDemo, в виде пакета NuGet или ссылки на проект.

    • Вариант 1 (ссылка на пакет):

      a. Щелкните правой кнопкой мыши по проекту CppConsoleApp и выберите Управление пакетами NuGet. Возможно, потребуется настроить источники пакетов, чтобы добавить ссылку на пакет NuGet AuthoringDemo. Для этого щелкните по значку Параметры в Диспетчере пакетов NuGet и добавьте источник пакета в соответствующий путь.

      NuGet settings

      b. После настройки источников пакетов найдите пакет AuthoringDemo и нажмите кнопку Установить.

      Install NuGet package

    • Вариант 2 (ссылка на проект):

      a. Щелкните правой кнопкой мыши по проекту CppConsoleApp и выберите Добавить ->Ссылку. В узле Проекты добавьте ссылку на проект AuthoringDemo.

  3. Чтобы разместить компонент, необходимо добавить файл манифеста для регистрации активируемых классов. Дополнительные сведения о размещении управляемых компонентов см. в разделе Размещение управляемых компонентов.

    a. Чтобы добавить файл манифеста, щелкните правой кнопкой мыши по проекту и выберите Добавить -> Новый элемент. Найдите шаблон Текстовый файл присвойте ему имя CppConsoleApp.exe. manifest. Вставьте следующее содержимое, указывающее классы среды выполнения с помощью записей регистрации активируемых классов:

    <?xml version="1.0" encoding="utf-8"?>
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
        <assemblyIdentity version="1.0.0.0" name="CppConsoleApp"/>
        <file name="WinRT.Host.dll">
            <activatableClass
                name="AuthoringDemo.Example"
                threadingModel="both"
                xmlns="urn:schemas-microsoft-com:winrt.v1" />
        </file>
    </assembly>
    

    Файл манифеста приложения необходим для приложений, которые не упаковываются. Для упакованных приложений потребитель приложения должен зарегистрировать активируемые классы в файле манифеста пакета, как описано в Package.appxmanifestпошаговом руководстве. Создание компонента C# с элементами управления WinUI 3 и использование из приложения пакета SDK для приложений для Windows C++.

    b. Внесите изменения в проект, включив файл манифеста в выходные данные при развертывании проекта. Щелкните по файлу CppConsoleApp.exe.manifest в обозревателе решений и задайте для свойства Содержимое значение True. Вот как это выглядит.

    Deploy Content

  4. Откройте pch.h в файлах заголовков проекта и добавьте следующую строку кода, чтобы включить компонент.

    #include <winrt/AuthoringDemo.h>
    
  5. Откройте файл main.cpp в исходных файлах проекта и замените его следующим содержимым.

    #include "pch.h"
    #include "iostream"
    
    using namespace winrt;
    using namespace Windows::Foundation;
    
    int main()
    {
        init_apartment();
    
        AuthoringDemo::Example ex;
        ex.SampleProperty(42);
        std::wcout << ex.SampleProperty() << std::endl;
        std::wcout << ex.SayHello().c_str() << std::endl;
    }
    
  6. Выполните сборку и запустите проект CppConsoleApp. Теперь вы должны увидеть результат, приведенный ниже.

    C++/WinRT Console output