Как активировать экземпляр класса 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»?

2

Решение

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]