C++ 如何激活ref类的实例

C++ 如何激活ref类的实例,c++,windows-runtime,c++-cx,wrl,C++,Windows Runtime,C++ Cx,Wrl,假设我有这门课: public ref class Page1 sealed : Windows::UI::Xaml::Controls::Page {}; 我可以像这样激活此类的实例: auto page = ref new Page1(); 但是在原始C++中如何做到?< /P> 我尝试过这个,但不起作用: Microsoft::WRL::Wrappers::HString className; className.Set(L"App1.Page1"); IInspectable *pa

假设我有这门课:

public ref class Page1 sealed : Windows::UI::Xaml::Controls::Page {};
我可以像这样激活此类的实例:

auto page = ref new Page1();
<>但是在原始C++中如何做到?< /P> 我尝试过这个,但不起作用:

Microsoft::WRL::Wrappers::HString className;
className.Set(L"App1.Page1");
IInspectable *page;
Windows::Foundation::ActivateInstance(className.Get(), &page);
当我指定一个windows运行时类名(例如“windows.UI.Xaml.Controls.Button”)时,上面的代码确实有效,只是我自己的ref类“App1.Page1”无效



或者,考虑到我已经在
App1
命名空间中声明了一个名为
Page1
的公共ref类,如何从字符串“App1.Page1”

中将该类的实例激活为
IInspectable*
。这个答案并不能直接解决激活任意类型的问题,但它满足了我的要求

魔鬼在细节中。XAML编译器将生成一组在解决方案资源管理器中不可见的文件。这些文件的扩展名为
.g.h
.g.hpp
。您可以单击解决方案资源管理器中的“显示所有文件”按钮查看它们

App.g.h
中,App类实现了
Windows::UI::Xaml::Markup::IXamlMetadataProvider
类,我们可以使用该类获取有关Xaml类型的信息。
XamlTypeInfo
文件包含生成的类型定义

下面是一些代码,展示了如何从
TypeName
激活一个XAML类型:

Object^ activate(TypeName typeName)
{
    auto app = Application::Current;
    auto provider = static_cast<IXamlMetadataProvider^>(app);
    auto xamlType = provider->GetXamlType(typeName);
    return xamlType->ActivateInstance();
}
Object^激活(TypeName-TypeName)
{
自动应用程序=应用程序::当前;
自动提供程序=静态播放(应用程序);
auto-xamlType=provider->GetXamlType(typeName);
返回xamlType->ActivateInstance();
}
由于XAML编译器生成的XAML类型信息,不需要WRL,100%C++/CX


我相信类似的结构也适用于C#projects,因为
应用程序
派生类也将实现
IXamlMetadataProvider
接口。实际上,Windows运行时不使用.NET,因此它没有任何类型的“真实”反射,因此它依赖于静态定义的类型定义。

稍微使用WRL通常不起作用。您通常也会用WRL声明页面,然后您现在就可以使用名称,因为您必须显式声明它。我认为C++/CX生成的名称是用下划线修饰到名称空间u.\u classname的,所以应该是“App1.\u Page1”。