У меня есть небольшое решение, которое содержит два проекта:
Компонент C ++ / WinRT содержит класс D3DPanel
, производный от Windows.UI.Xaml.Controls.SwapChainPanel
.Код компилируется, элемент управления появляется и прекрасно работает при добавлении на страницу в приложении UWP C #.
Однако, когда я вызываю единственный метод void StartRenderLoop()
, который предоставляет мой производный элемент управления, я получаю:
System.InvalidCastException 'Unable to cast object of type 'WRT_CPP.D3DPanel' to type 'WRT_CPP.ID3DPanel'.'
at System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRT(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget)
at WRT_CPP.D3DPanel.StartRenderLoop()
at UWP_APP.MainPage.OnNavigatedTo(NavigationEventArgs e)
Вот код idl:
namespace WRT_CPP
{
[default_interface]
runtimeclass D3DPanel : Windows.UI.Xaml.Controls.SwapChainPanel
{
D3DPanel();
void StartRenderLoop();
}
}
Вот как объявляется класс реализации:
struct D3DPanel : Windows::UI::Xaml::Controls::SwapChainPanelT<D3DPanel>
{
...
void StartRenderLoop();
...
}
(Причина, по которой я знаю, что элемент управления работает, заключается в том, чтоесли я вызываю StartRenderLoop()
из компонента WinRT во время OnLoaded
, все выглядит нормально).
(почти) минимальная версия исходного кода может быть найдена по адресу: https://github.com/zrajnai/UWP_DX
Чтобы воспроизвести проблему, закомментируйте вызов StartRenderLoop из кода C ++ / Winrt по адресу: https://github.com/zrajnai/UWP_DX/blob/227226e8dfbaf2b9b6ce78b6eb02c727c197e284/WRT_CPP/D3DPanel.cpp#L332
и раскомментируйте строку, которая вызывает исключение: https://github.com/zrajnai/UWP_DX/blob/227226e8dfbaf2b9b6ce78b6eb02c727c197e284/UWP_APP/MainPage.xaml.cs#L19
Любая помощь приветствуется.