InvalidCastException при вызове wrt / c ++ компонента среды выполнения Windows из проекта UWP Application C # - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть небольшое решение, которое содержит два проекта:

  • приложение UWP (C #)

  • компонент среды выполнения Windows (C ++ /WinRT), на который ссылается приложение.

Компонент 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

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 14 февраля 2019

Проблемы были в классе реализации

struct D3DPanel : Windows::UI::Xaml::Controls::SwapChainPanelT<D3DPanel>

Я должен был добавить ID3DPanel в качестве универсального параметра, а также сам класс реализации.

struct D3DPanel : Windows::UI::Xaml::Controls::SwapChainPanelT<D3DPanel, ID3DPanel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...