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

C# Release模式下ISwapChainPanelNative抛出异常求助

问题描述

用C#开发应用时,只有在Release模式下调用SwapChainPanel.As<ISwapChainPanelNative>()会抛出异常,Debug模式完全正常。错误提示如下:

内置COM已通过功能开关被禁用。

触发异常的代码:

ISwapChainPanelNative panelNative = MySwapChainPanel.As<ISwapChainPanelNative>();

用到的ISwapChainPanelNative接口定义:

[Guid("63aad0b8-7c24-40ff-85a8-640d944cc325")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComImport]
internal interface ISwapChainPanelNative
{
    int SetSwapChain([In] IntPtr swapChain);
}
解决方法

这是因为Release模式下.NET的ILLink代码裁剪工具默认禁用了部分COM互操作功能,你可以通过以下几种方式解决:

  • 启用内置COM支持的功能开关
    在项目的runtimeconfig.json文件中添加配置,开启内置COM互操作:
{
  "runtimeOptions": {
    "configProperties": {
      "System.Runtime.InteropServices.BuiltInComInterop.IsSupported": true
    }
  }
}
  • 让裁剪工具保留COM互操作类型
    如果用的是.NET 6及以上版本,有两种方式:

    1. 在项目文件(.csproj)里添加配置,指定包含该接口的程序集不被裁剪:
    <ItemGroup>
      <TrimmerRootAssembly Include="你的程序集名称" />
    </ItemGroup>
    

    把你的程序集名称换成实际包含ISwapChainPanelNative的程序集名字。

    1. 给接口添加特性标记,告诉裁剪工具保留该类型:
    using System.Diagnostics.CodeAnalysis;
    
    [Guid("63aad0b8-7c24-40ff-85a8-640d944cc325")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
    internal interface ISwapChainPanelNative
    {
        int SetSwapChain([In] IntPtr swapChain);
    }
    
  • 禁用相关裁剪规则(不推荐,仅应急用)
    如果上面的方法都不管用,可以在项目文件里关闭部分裁剪分析,但会导致程序体积变大:

<PropertyGroup>
  <TrimMode>partial</TrimMode>
  <EnableTrimAnalyzer>false</EnableTrimAnalyzer>
</PropertyGroup>

内容的提问来源于stack exchange,提问作者kinton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:26:11