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及以上版本,有两种方式:- 在项目文件(.csproj)里添加配置,指定包含该接口的程序集不被裁剪:
<ItemGroup> <TrimmerRootAssembly Include="你的程序集名称" /> </ItemGroup>把
你的程序集名称换成实际包含ISwapChainPanelNative的程序集名字。- 给接口添加特性标记,告诉裁剪工具保留该类型:
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
相关产品推荐
相关产品推荐

