Как активировать экземпляр класса ref

Скажем, у меня есть этот класс:

public ref class Page1 sealed : Windows::UI::Xaml::Controls::Page {};

Я могу активировать экземпляр этого класса следующим образом:

auto page = ref new Page1();

Но как мне это сделать в сыром C++?

Я пробовал это, но это не работает:

Microsoft::WRL::Wrappers::HString className;
className.Set(L"App1.Page1");
IInspectable *page;
Windows::Foundation::ActivateInstance(className.Get(), &page);

Приведенный выше код работает, когда я указываю имя класса среды выполнения Windows (например, "Windows.UI.Xaml.Controls.Button"), но не мой собственный класс ссылки "App1.Page1".


В качестве альтернативы, учитывая, что я объявил публичный класс ref с именем Page1 в App1 пространство имен, как я могу активировать экземпляр этого класса как IInspectable* из HSTRING "App1.Page1"?

1 ответ

Решение

Я думаю, что я понял это. Ну, этот ответ напрямую не решает проблему активации любого произвольного типа, но он делает то, что я хочу.

Дьявол кроется в деталях. Компилятор XAML создаст группу файлов, не видимых в обозревателе решений. Эти файлы имеют расширение .g.h а также .g.hpp, Вы можете нажать кнопку "Показать все файлы" в обозревателе решений, чтобы просмотреть их.

В App.g.hкласс App реализует Windows::UI::Xaml::Markup::IXamlMetadataProvider класс, который мы можем использовать для получения информации о наших типах XAML. XamlTypeInfo Файлы содержат сгенерированные определения типов.

Вот некоторый код, который показывает, как активировать один из наших типов XAML из TypeName:

Object^ activate(TypeName typeName)
{
    auto app = Application::Current;
    auto provider = static_cast<IXamlMetadataProvider^>(app);
    auto xamlType = provider->GetXamlType(typeName);
    return xamlType->ActivateInstance();
}

Нет необходимости в WRL, 100% C++/CX, благодаря информации о типе XAML, сгенерированной компилятором XAML!

Я полагаю, что подобная структура также имеет место для проектов C#, в том, что Applicationкласс будет реализован IXamlMetadataProvider интерфейс тоже. Под капотом среда выполнения Windows не использует.NET, поэтому у нее нет никакого "реального" отражения, поэтому она опирается на статически определенные определения типов.

Другие вопросы по тегам