Как активировать экземпляр класса 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, поэтому у нее нет никакого "реального" отражения, поэтому она опирается на статически определенные определения типов.