Поделиться через


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

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

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

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

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

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

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

Примечание.

Сведения об установке и использовании расширения 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 сначала пытается вызвать RoGetActivationFactory. Если это не удается, C++/WinRT пытается найти библиотеку DLL для загрузки напрямую. среда выполнения Windows активация всегда основана на полном имени класса. Логика заключается в удалении имени класса (из этого полного имени класса), а затем искать библиотеку DLL с именем полного пространства имен, которое остается. Если это не найдено, удалите наиболее конкретное имя сегмента и повторите его.

Например, если активируемый класс имеет полное имя Contoso.Instruments.ThermometerWRC.Thermometer.Thermometer и RoGetActivationFactory завершается ошибкой, то сначала найдите Contoso.Instruments.ThermometerWRC.dllобъект. Если это не найдено, то мы будем искать Contoso.Instruments.dll, а затем для Contoso.dll.

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

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

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

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

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

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

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

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

Во время сборки запускается инструмент midl.exe для создания файла метаданных компонента среды выполнения Windows (\ThermometerWRC\Debug\ThermometerWRC\ThermometerWRC.winmd). Затем запускается средство cppwinrt.exe (с параметром -component) для создания файлов исходного кода для поддержки создания компонента. Эти файлы включают заглушки, чтобы приступить к реализации класса среды выполнения Thermometer, объявленного в 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метод AdjustTemperature, как показано в приведенном ниже списке.

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

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

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

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

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

Примечание.

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

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

Во время сборки запускается средство 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 см. в разделе "Общие сведения о языке определения интерфейса Майкрософт" 3.0.

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

Устранение неполадок

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