Да, наследуемый именно в кавычках. Потому что речь идёт о «наследовании» в терминах WinRT компонентов.
Данный класс при подключении библиотеки к .NET проекту, будет виден как незапечатанный. Но это только .NET реализация проекции WinRT.
Конечно, тестировалась релизная сборка. Настройки компиляции релизной сборки не менял, значения были по-умолчанию (ну кроме того, что полностью выключил генерацию отладочной информации.
Мельком просмотрел статью. Следующее утверждение бросилось в глаза:
WinMD это библиотека классов Windows Runtime, которая создана специально и только для Windows Store приложений (в отличие от PCL). Если ее код написать на C++, то при обращении к ней из приложений на C#/JavaScript производительность возрастет по сравнение с тем же кодом на C#.
Хотелось бы немного дополнить.
Во-первых, WinMD — это файл метаданных для описания API, который предоставляется компонентом, а не библиотека. Наличие WinMD файла ещё не гарантирует корректную загрузку компонента(dll с кодом может вовсе отсутствовать).
Во-вторых, есть много нюансов работы WinRT компонентов. К примеру, если написать WinRT компонент на C# и вызывать методы из C# кода, то CLR не будет использовать WinRT ABI, а будет вызывать код напрямую. В случае же, если компонент написан на C++, то передача типов будет происходить через ABI, что медленнее прямого вызова C# — C#.
Внимательный читатель мог заметить странную деталь в конструкторах и деструкторах классов, а именно инкремент и декремент переменной m_objectsCount. Данную переменную я объявил сразу после директив using перед кодом классов. А используется она в экспортируемой библиотекой функции DllCanUnloadNow:
Подсчет объектов нужен, для того, чтобы исполняющая среда узнала может ли она выгрузить библиотеку.
А в коде определение переменной выглядит вот так
#include "pch.h"
#include "TestComponent.h"
//Импортируем пространство имён нашего компонента
using namespace ABI::NMSPC::TestComponent;
//Импортируем интерфейсы из пространства имён ABI::Windows::ApplicationModel::Background
using ABI::Windows::ApplicationModel::Background::IBackgroundTask;
using ABI::Windows::ApplicationModel::Background::IBackgroundTaskInstance;
//Переменная для хранения числа текущих экземпляров объектов библиотеки.
//Значение данной переменной будем изменять в конструкторах объектов реализации
//фоновой задачи и фабрики.
ULONG m_objectsCount = 0;
..................................................................
Данный класс при подключении библиотеки к .NET проекту, будет виден как незапечатанный. Но это только .NET реализация проекции WinRT.
Протестировал своё предположение на C#
Для удобства восприятия могу его записать так:
Кроме того. Привёл к этому же виду код проекта CSWinRT:
Результаты стали даже хуже:
Хотелось бы немного дополнить.
Во-первых, WinMD — это файл метаданных для описания API, который предоставляется компонентом, а не библиотека. Наличие WinMD файла ещё не гарантирует корректную загрузку компонента(dll с кодом может вовсе отсутствовать).
Во-вторых, есть много нюансов работы WinRT компонентов. К примеру, если написать WinRT компонент на C# и вызывать методы из C# кода, то CLR не будет использовать WinRT ABI, а будет вызывать код напрямую. В случае же, если компонент написан на C++, то передача типов будет происходить через ABI, что медленнее прямого вызова C# — C#.
PS: поздравляю с получением сертификата!!!
Подсчет объектов нужен, для того, чтобы исполняющая среда узнала может ли она выгрузить библиотеку.
А в коде определение переменной выглядит вот так
Для проверки HRESULT лучше использовать макросы
Они уже определены в заголовочных файлах(в WRL это intsafe.h).