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

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

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

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

Предпосылки

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

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

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

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

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

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

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

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

    б. Найдите Майкрософт.Windows. CsWinRT пакет NuGet и установите последнюю версию.

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

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

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

  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 для вашего компонента. Щелкните проект правой кнопкой мыши в Обозреватель решений и щелкните Build. Вы увидите созданный AuthoringDemo.winmd файл в выходной папке сборки.

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

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

Существует несколько способов создания пакета NuGet:

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

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

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

Потребление компонента из приложения C++/WinRT

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

Замечание

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

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

    a. В Обозреватель решений щелкните правой кнопкой мыши узел решения и щелкните Add ->New Project.

    б. В диалоговом окне Add New Project найдите шаблон C++/WinRT Console Application project. Выберите шаблон и нажмите кнопку "Далее".

    с. Назовите новый project CppConsoleApp и щелкните Create.

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

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

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

      параметры NuGet

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

      Установка пакета NuGet

    • Option 2 (справка по Project):

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

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

    a. Чтобы добавить файл манифеста, снова щелкните правой кнопкой мыши project и выберите Add -> Новый элемент. Найдите шаблон текстового файла и назовите его 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 и использование его в приложении на C++ с Windows App SDK.

    б. Измените проект, чтобы файл манифеста был включен в выходные данные при развертывании проекта. Щелкните файл CppConsoleApp.exe.manifest в Обозреватель решений и задайте для свойства Content значение True. Ниже приведен пример того, как это выглядит.

    развертывание содержимого

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

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

    #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 project. Теперь вы увидите приведенные ниже выходные данные.

    выходные данные консоли C++/WinRT