从UWP Application C#项目调用wrt / c ++ Windows运行时组件时,InvalidCastException

时间:2019-02-13 13:15:05

标签: uwp winrt-xaml uwp-xaml c++-winrt winrt-component

我有一个包含两个项目的小型解决方案:

  • UWP应用(C#)

  • 该应用程序引用的Windows运行时组件(C ++ / WinRT)。

C ++ / WinRT组件包含一个D3DPanel派生的类Windows.UI.Xaml.Controls.SwapChainPanel。 将代码编译,显示控件,并且将其添加到UWP C#App中的页面时可以正常工作。

但是,当我调用派生控件公开的单个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

要重现该问题,请在以下位置的C ++ / Winrt代码中注释掉对StartRenderLoop的调用: 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 :(得分:0)

问题出在实现类中

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

我应该添加ID3DPanel作为通用参数以及实现类本身。

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