发布模式下MonoTouch的Linq方法JIT错误

3

我目前有一些代码,如下所示,使用Linq来为我组织一些IEnumerables。 当在设备上以发布模式(iOS 5.0.1,MonoTouch 5.0.1,Mono 2.10.6.1)执行此代码时,会出现以下异常

尝试使用--aot-only运行时编译方法“System.Linq.OrderedEnumerable`1:GetEnumerator()”。

导致此错误的代码是:

// List<IncidentDocument> documents is passed in
List<LibraryTableViewItemGroup> groups = new List<LibraryTableViewItemGroup>();
List<DocumentObjectType> categories = documents.Select(d=>d.Type).Distinct().OrderBy(s=>s.ToString()).ToList();
foreach(DocumentObjectType cat in categories)
{
    List<IncidentDocument> catDocs = documents.Where(d => d.Type == cat).OrderBy(d => d.Name).ToList();
    List<LibraryTableViewItem> catDocsTableItems = catDocs.ConvertAll(d => { return new LibraryTableViewItem{ Image = GetImageForDocument(d.Type), Title = d.Name, SubTitle = d.Description}; });
    LibraryTableViewItemGroup catGroup = new LibraryTableViewItemGroup{ Name = GetCatName(cat), Footer = null, Items = catDocsTableItems };
    groups.Add (catGroup);
}           

这个错误在Release|Debug配置的模拟器中不会发生,也不会在Debug配置的设备上发生。我在Stack Overflow看到了几个类似的帖子这里这里,但我不确定它们如何适用于我在这个特定问题上。


https://dev59.com/blnUa4cB1Zd3GeqPfvyC - TheNextman
我觉得我在告诉编译器AOT所有内容,所以它不需要提前发现类型,我看到了解决方法,但我不明白为什么在Release/Device模式下需要这样做。如果我告诉Linq生成一个具体类型的列表,比如.ToList<DocumentObjectType>()而不是.ToList(),那么这是否足够让编译器正确地AOT这些类型呢? - pseabury
不,因为问题在于IOrderedEnumerable<T>,而不是List<T>。尽管我不知道如何在没有orderby的情况下创建一个IOrderedEnumerable<DocumentObjectType>。 - TheNextman
1个回答

3
这可能是几个问题。
  • 使用完全AOT构建iOS应用程序时(苹果的限制),即确保在运行时不会进行JIT编译,存在一些限制。每个限制都不同,即使消息看起来相同(即许多原因都会导致此问题)。但是,通常我们可以为它们提供简单的解决方法;

  • 这也可能是5.0.1中已知的退化(在5.0.2中已修复)。这会产生一些额外的AOT失败,通常不是问题(或已经修复的问题)。

我建议您升级到MonoTouch 5.0.2,以查看它是否正确编译您的应用程序。如果不行,请在http;//bugzilla.xamarin.com上填写错误报告,并包括一个小型、自包含的测试用例以复制该问题(上述内容不够完整)。如果启用了调试,则它似乎是一个有趣的测试案例。


我升级到了5.0.2版本,创建了一个小的测试用例,在硬件上仍然存在发布模式下的问题。正如您所提到的,我将提交一个错误报告。感谢您抽出时间回复! - pseabury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接