Windows App SDK C#使用SharpDX获取SwapChainPanel原生COM对象异常如何解决
问题原因
你遇到的E_NOINTERFACE报错和.NET版本无关,核心是两个原因导致:
- SharpDX已停止维护,其内置的
DXGI.ISwapChainPanelNative2接口仅适配UWP平台的Windows.UI.Xaml.Controls.SwapChainPanel,WinUI 3中Microsoft.UI.Xaml.Controls.SwapChainPanel对应的原生COM接口没有被SharpDX适配,直接调用SharpDX的ComObject.As方法无法查询到对应接口。 - WinUI 3的WinRT组件获取原生COM指针的逻辑和UWP不同,不能直接使用SharpDX提供的COM对象转换方法,需要用WinRT运行时自带的接口转换能力。
解决方案
第一步:自行定义适配WinUI 3的SwapChainPanel原生COM接口
在项目中添加如下接口定义:
using System.Runtime.InteropServices; using SharpDX.DXGI; using WinRT; [ComImport] [Guid("63aad0b8-7c24-40ff-85a8-640d9888")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface ISwapChainPanelNative { void SetSwapChain(SwapChain swapChain); } // 如需使用ISwapChainPanelNative2的扩展能力可以补充定义 [ComImport] [Guid("494874eb-5497-4f9f-b90d-189ab29a3b6b")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface ISwapChainPanelNative2 : ISwapChainPanelNative { void SetSwapChainHandle(IntPtr swapChainHandle); }
第二步:替换原有接口获取逻辑
将原来的SharpDX转换代码替换为以下实现:
// 用WinRT自带的As方法获取原生接口 var nativePanel = m_SwapChainPanel.As<ISwapChainPanelNative>(); nativePanel.SetSwapChain(m_SwapChain); // 不需要手动释放原生接口对象,WinRT运行时会自动管理生命周期
验证点
如果修改后还有报错,检查SwapChain创建参数:
- 确保SwapChain的
Format属性设置为B8G8R8A8_UNorm,和WinUI 3渲染管线格式兼容 - 确保SwapChain描述中
SampleDesc.Count设置为1,WinUI 3 SwapChainPanel不支持多重采样的SwapChain,需要多重采样要自行实现离屏渲染后再resolve到交换链 - 确保SwapChain创建时没有开启
HWND关联参数,SwapChainPanel的交换链不需要绑定窗口句柄
额外建议
SharpDX已于2019年停止正式维护,建议逐步迁移到其社区继任项目Vortice.Windows,该项目原生适配.NET 5+、WinUI 3和Windows App SDK,内置了对应SwapChainPanel的原生接口定义,适配成本更低。
内容的提问来源于stack exchange,提问作者Can Talat Yakan
相关产品推荐
相关产品推荐

