c# – 在Universal Windows中将IEnumerable更改为IQueryable时出现MissingRuntimeArtifactException

在发布模式下,使用AsQueryable方法将IEnumerable源更改为IQueryable时抛出System.Reflection.MissingRuntimeArtifactException.这是代码在调试模式下工作正常,请参考下面的代码片段.

    ObservableCollection<object> data;
    IEnumerable source;
    public MainPage()
    {
        this.InitializeComponent();
        data = new ObservableCollection<object>();
        source = data as IEnumerable;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var querab1 = data.AsQueryable();
        var querab2 = source.AsQueryable();
    }

这个例外有什么解决方案吗?

最佳答案 将以下行添加到< Application>运行时指令文件中的节点(通常称为Default.rd.xml,位于Properties文件夹中).

<Namespace Name="System.Linq" Dynamic="Required All" Serialize="Required All" XmlSerializer="Required All"/>

使用Release模式调用.NET Native工具链.它在最终的app程序集中仅包含应用程序实际调用的代码.这会导致某些反射和后期绑定调用代码不包含在您的应用中.使用运行时指令文件可以覆盖默认行为并包含所需的元数据和实现代码.

PS:您的运行时指令文件应如下所示:

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="*Application*" Dynamic="Required All" />
    <Namespace Name="System.Linq" Dynamic="Required All" Serialize="Required All" XmlSerializer="Required All" />
  </Application>
</Directives>
点赞