You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:15:07