UWP应用经.NET Native编译后启动抛出MissingMetadataException异常
解决方案
这是.NET Native编译阶段对WinRT互操作用到的泛型类型元数据过度裁剪导致的问题,可按以下步骤排查修复:
- 修正运行时指令(项目里的
Default.rd.xml文件)的写法,你之前的写法存在泛型类型解析不匹配的问题,替换为以下内容即可:
<Type Name="Windows.Foundation.IReference`1[[System.Double, System.Private.CoreLib]]" Dynamic="Required All" />
如果上述写法仍不生效,可直接对Windows.Foundation命名空间下的对应IReference泛型类型做全局保留:
<Namespace Name="Windows.Foundation" > <TypeInstantiation Name="IReference" Arguments="System.Double" Dynamic="Required All" /> </Namespace>
- 也可以通过硬编码引用类型的方式绕开rd.xml配置,在项目任意公共类中加入以下代码即可:
using System.Runtime.CompilerServices; using Windows.Foundation; public class DummyClass { [Preserve] private static void KeepIReferenceMetadata() { _ = default(IReference<double>); } }
[Preserve]特性会告诉.NET Native编译器不要裁剪该方法引用的所有类型,不需要主动调用该方法也会生效。
- 排查XAML绑定逻辑,确认是否存在将
double?类型的属性直接绑定到原生依赖属性的场景,如果有可以新增一个非空的double类型的包装属性做绑定中转,也能规避该反射调用异常。
内容的提问来源于stack exchange,提问作者NPadrutt
相关产品推荐
相关产品推荐

