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

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

существует несколько причин для создания среда выполнения Windows компонента в C++/винрт.

  • Для эффективного использования преимуществ C++ в сложных или ресурсоемких операциях.
  • Повторное использование стандартного кода C++, который уже написан и протестирован.
  • для предоставления функциональных возможностей Win32 для приложения универсальная платформа Windows (UWP), написанного на, например C#.

Как правило, при создании компонента C++/WinRT можно использовать типы из стандартной библиотеки C++ и встроенные типы, за исключением границ интерфейса, в которых данные передаются в код другого .winmd пакета и из него. в ABI используйте типы среда выполнения Windows. Кроме того, в коде C++/WinRT используйте такие типы, как делегат и Event, для реализации событий, которые могут быть вызваны из компонента и обрабатываться на другом языке. Дополнительные сведения о C++/Винрт. см. в разделе c++/WinRT

оставшаяся часть этого раздела посвящена созданию среда выполнения Windows компонента в C++/WinRT и последующему его использованию из приложения.

компонент среда выполнения Windows, который предстоит создать в этом разделе, содержит класс среды выполнения, представляющий термометр. В этом разделе также демонстрируется основное приложение, использующее класс среды выполнения термометра, и вызывается функция для настройки температуры.

Примечание

Сведения об установке и использовании расширения C++/WinRT для Visual Studio (VSIX) и пакета NuGet (которые вместе обеспечивают поддержку шаблона проекта и сборки) см. в разделе о поддержке C++/WinRT в Visual Studio.

Важно!

Основные понятия и термины, которые помогают понять, как использовать и создавать классы среды выполнения с помощью C++/WinRT, описаны в разделах Использование интерфейсов API с помощью C++/WinRT и Создание интерфейсов API с помощью C++/WinRT.

именование рекомендаций для библиотек dll компонента среда выполнения Windows

Важно!

в этом разделе описывается соглашение об именовании, которое рекомендуется использовать для .dll файла (DLL), в который строится компонент среда выполнения Windows. это все о последовательности активации, которую C++/WinRT следует при использовании класса среды выполнения из компонента среда выполнения Windows.

При активации фабрики класса C++/WinRT сначала пытается вызвать рожетактиватионфактори. Если это не удается, C++/WinRT пытается найти библиотеку DLL для загрузки напрямую. среда выполнения Windows активация всегда основана на полном имени класса. Логика заключается в том, чтобы удалить имя класса (из этого полного имени класса), а затем найти библиотеку DLL с именем для полного пространства имен, которое остается. Если он не найден, удалите наиболее конкретное имя сегмента и повторите операцию.

Например, если активируемый класс имеет полное имя contoso. Instruments. сермометерврк. термометр, а рожетактиватионфактори — сбой, то сначала мы рассмотрим Contoso.Instruments.ThermometerWRC.dll . Если он не найден, мы будем искать Contoso.Instruments.dll , а затем для Contoso.dll .

При обнаружении библиотеки DLL (в этой последовательности) мы будем использовать эту точку входа дллжетактиватионфактори библиотеки DLL, чтобы попытаться получить фабрику напрямую (а не косвенно с помощью функции рожетактиватионфактори , которая была первой предпринята). Таким образом, конечный результат становится неразличимым для вызывающего объекта и библиотеки DLL.

Этот процесс полностью автоматизирован — не требуется регистрация или инструментарий. при создании среда выполнения Windows компонента необходимо просто использовать соглашение об именовании для библиотек dll, которые работают с описанным выше процессом. если вы используете среда выполнения Windows компонент и он не именуется правильно, вы можете переименовать его, как описано выше.

создание среда выполнения Windows компонента (сермометерврк)

Начните с создания проекта в Microsoft Visual Studio. создайте проект среда выполнения Windows компонента (C++/WinRT) и назовите его сермометерврк (для "компонента" термометр среда выполнения Windows Component "). Убедитесь, что снят флажок Поместить решение и проект в одном каталоге. В качестве цели выберите последнюю общедоступную (то есть не предварительную) версию Windows SDK. Именование проекта сермометерврк предоставит вам самый простой способ работы с остальными шагами, описанными в этом разделе.

На этом этапе проект создавать не нужно.

Созданный проект содержит файл с именем Class.idl. В обозревателе решений переименуйте файл Thermometer.idl (при переименовании файла с расширением .idl также автоматически переименовываются зависимые файлы .h и .cpp). Замените содержимое Thermometer.idl на перечисленное ниже.

// Thermometer.idl
namespace ThermometerWRC
{
    runtimeclass Thermometer
    {
        Thermometer();
        void AdjustTemperature(Single deltaFahrenheit);
    };
}

Сохраните файл. В данный момент проект не будет строиться до завершения, но сборка сейчас будет полезной, поскольку создает файлы исходного кода, в которых реализуется класс среды выполнения термометра . Так что действуйте и выполняйте сборку сейчас (ошибки сборки, которые можно ожидать на этом этапе, связанны с тем, что не удалось найти Class.h и Class.g.h).

Во время сборки запускается инструмент midl.exe для создания файла метаданных компонента среды выполнения Windows (\ThermometerWRC\Debug\ThermometerWRC\ThermometerWRC.winmd). Затем запускается средство cppwinrt.exe (с параметром -component) для создания файлов исходного кода для поддержки создания компонента. Эти файлы включают заглушки, чтобы приступить к реализации класса среды выполнения термометра , объявленного в IDL. Это заглушки \ThermometerWRC\ThermometerWRC\Generated Files\sources\Thermometer.h и Thermometer.cpp.

Щелкните правой кнопкой мыши узел проекта и нажмите кнопку Открыть папку в проводнике. После этого в проводнике откроется папка проекта. Там скопируйте файлы заглушки Thermometer.h и Thermometer.cpp из папки \ThermometerWRC\ThermometerWRC\Generated Files\sources\ в папку, содержащую файлы проекта (\ThermometerWRC\ThermometerWRC\), и замените файлы в месте назначения. Теперь давайте откроем Thermometer.h и Thermometer.cpp и реализуем класс среды выполнения. В Thermometer.h добавьте новый закрытый член в реализацию (ане в фабричную реализацию) термометра.

// Thermometer.h
...
namespace winrt::ThermometerWRC::implementation
{
    struct Thermometer : ThermometerT<Thermometer>
    {
        ...

    private:
        float m_temperatureFahrenheit { 0.f };
    };
}
...

В Thermometer.cpp реализуйте метод аджусттемпературе , как показано в приведенном ниже списке.

// Thermometer.cpp
...
namespace winrt::ThermometerWRC::implementation
{
    void Thermometer::AdjustTemperature(float deltaFahrenheit)
    {
        m_temperatureFahrenheit += deltaFahrenheit;
    }
}

В верхней части Thermometer.h и Thermometer.cpp вы увидите static_assert, который нужно удалить. Теперь сборка проекта будет выполнена.

Если какие-либо предупреждения не позволяют выполнить сборку, тогда устраните их или установите для свойства проекта C/C++>Общие>Обрабатывать предупреждения как ошибки значение Нет (/WX-) и выполните сборку проекта заново.

создание основного приложения (сермометеркореапп) для тестирования компонента среда выполнения Windows

Теперь создайте новый проект (в решении сермометерврк или в новом). Создайте проект основного приложения (C++/WinRT) и назовите его сермометеркореапп. Задайте сермометеркореапп в качестве запускаемого проекта, если два проекта находятся в одном решении.

Примечание

как упоминалось ранее, в папке \ThermometerWRC\Debug\ThermometerWRC\ создается файл метаданных среда выполнения Windows для компонента среда выполнения Windows (проект которого называется сермометерврк). Первый сегмент этого пути — это имя папки, содержащей файл решения. Следующий сегмент — это подкаталог с именем Debug. Последний сегмент — это подкаталог, названный для компонента среды выполнения Windows. Если вы не назначите имя проекта сермометерврк, файл метаданных будет находиться в папке \<YourProjectName>\Debug\<YourProjectName>\ .

Теперь в проекте основного приложения (сермометеркореапп) добавьте ссылку и перейдите к \ThermometerWRC\Debug\ThermometerWRC\ThermometerWRC.winmd (или добавьте ссылку проекта на проект, если два проекта находятся в одном решении). Нажмите кнопку Добавить, а затем кнопку OK. Теперь создайте сермометеркореапп. в маловероятном случае, если отображается сообщение об ошибке, что файл readme.txt полезных данных не существует, исключите этот файл из проекта компонента среда выполнения Windows, перестройте его и перестройте сермометеркореапп.

Во время сборки запускается средство cppwinrt.exe для обработки указанного файла .winmd в файлы исходного кода, содержащие проецируемые типы для поддержки использования вашего компонента. Заголовок проецируемых типов для классов среды выполнения компонента, именуемый ThermometerWRC.h , создается в папке \ThermometerCoreApp\ThermometerCoreApp\Generated Files\winrt\ .

Включите этот заголовок в App.cpp.

// App.cpp
...
#include <winrt/ThermometerWRC.h>
...

Кроме того, в App.cpp добавьте следующий код для создания экземпляра объекта термометра (с помощью конструктора по умолчанию проецируемого типа) и вызовите метод для объекта термометра.

struct App : implements<App, IFrameworkViewSource, IFrameworkView>
{
    ThermometerWRC::Thermometer m_thermometer;
    ...
    
    void OnPointerPressed(IInspectable const &, PointerEventArgs const & args)
    {
        m_thermometer.AdjustTemperature(1.f);
        ...
    }
    ...
};

Каждый раз при щелчке по окну увеличивается температура объекта термометра. вы можете задать точки останова, если хотите пошагово выполнить код, чтобы убедиться, что приложение действительно вызывает компонент среда выполнения Windows.

Следующие шаги

чтобы добавить еще больше функциональных возможностей или новых типов среда выполнения Windows в компонент C++/WinRT среда выполнения Windows, можно следовать тем же шаблонам, которые показаны выше. Во-первых, используйте IDL для определения функциональности, которую нужно предоставить. затем выполните сборку проекта в Visual Studio, чтобы создать реализацию заглушки. А затем завершите реализацию соответствующим образом. все методы, свойства и события, определенные в IDL, видимы для приложения, использующего компонент среда выполнения Windows. Дополнительные сведения о IDL см. в статье Введение в язык MIDL 3,0.

пример добавления события в компонент среда выполнения Windows см. в разделе создание событий в C++/WinRT.

Диагностика

Симптом Средство
В приложении C++/WinRT, при работе с компонентом C# среды выполнения Windows, который использует XAML, компилятор создает ошибку в форме "'MyNamespace_XaRuntime componentmlTypeInfo': не является членом 'winrt::MyNamespace'"— где MyNamespace — имя пространства имен компонента среды выполнения Windows. В pch.h в приложении "использование приложения/WinRT C++" добавьте #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> — Замена MyNamespace соответствующим образом.