【问题标题】:MonoTouch mysteriously not aot-compiling methods and properties?MonoTouch 神秘地不编译方法和属性?
【发布时间】:2012-04-26 06:34:34
【问题描述】:

我有一个奇怪的问题,MonoTouch 似乎要么没有编译方法,要么找不到它被指示调用的已编译方法,并且仅在发布配置中的设备上 - 调试版本很好。我尝试使用更简单的代码示例重现它,但没有运气,所以我怀疑您是否能够使用下面的代码看到行为。但这基本上就是我正在做的事情:

using System;
using MonoTouch.UIKit;

public class MyClass
{
    private UINavigationController _navController;
    private UIViewControler _viewController;

    public UINavigationController NavController
    {
        get
        {
            if (_navController == null)
            {
                if (_viewController == null)
                {
                    _viewController = new UIViewController();
                }
                _navController = new UINavigationController(_viewController);
            }
            return _navController;
        }
    }
}

然后,用其他方法……

public void SomeMethod()
{
    MyClass myClass = new MyClass();
    var navController = myClass.NavController; // <-- This is where it throws
}

我得到的异常是标准的 JIT 编译消息,说它试图 JIT get_NavController()。我觉得这很奇怪,因为没有虚拟泛型,没有 LINQ,链接器已关闭,而且似乎没有涉及通常导致 JIT 的其他任何内容。我还验证了它会抛出 MyClass 上定义的其他方法和属性,但不会抛出构造函数或 System.Object 继承的方法。反射显示myClass.GetType().GetMembers() 有一个 MemberInfo 可以满足我的所有期望。然而,仅适用于 Release|iPhone,我无法访问这些方法或属性。我能得出的唯一合乎逻辑的结论是 aot 编译步骤缺少它们,我根本不知道为什么会发生这种情况,更不用说仅在 Release 配置中。

我的问题是,什么可能会导致这种情况,以及修复它的下一步是什么?我什至不知道从哪里开始调试这个,或者提交一个关于什么的错误,因为我无法在我们(很多)更大的项目的上下文中重现它。

更新:请求了确切的异常文本。

System.ExecutionException: Attempting to JIT compile method
'MyNamespace.MyClass.get_NavController ()' while running with --aot-only

【问题讨论】:

  • 你能解释一下“NavController”应该是什么吗?它不是一种方法(没有括号),也不是“getter”(不是获取或设置)。这可能是整个问题吗?
  • 是的,它是一个带有 getter 的属性。我已经更新了代码以修复我的遗漏。

标签: c# xamarin.ios jit aot


【解决方案1】:

这似乎不是可以在这里解决的问题。

如果您无法制作更小的测试用例,我建议您提交一个错误,并附上整个项目。如果您不希望您的项目公开可见,您可以提交只有 Xamarin 员工有权访问的私有错误。

【讨论】:

  • 我无权附加我们的整个源代码,但我会提交错误并附加二进制文件。
  • 我们隔离了原因。在引用也是 iOS 应用程序的程序集时,MonoDevelop 中存在错误。它为编译器提供了应用程序包内剥离程序集的路径,而不是正常编译的 exe。链接:bugzilla.xamarin.com/show_bug.cgi?id=4530
【解决方案2】:

你能尝试显式声明变量吗

UINavigationController navController = myClass.NavController;

另外,我想知道这是否与需要等待调用 UIViewController.ViewDidLoad 方法有关,因为类的内部可能尚未初始化?

这里只是在黑暗中拍摄,我想不出你的代码不起作用的原因。

【讨论】:

  • 在实际代码中,该属性作为参数传递给函数,但无论我如何使用它都会抛出。没有任何代码与视图有关,只与控制器有关,而且在过去它也有效;我还在追查它到底是什么时候坏的。
  • 对我来说,这也表明有齿轮在移动,上面显示的代码可能不是真正的罪魁祸首,可能与运行时的其他东西有关。您是否正在使用反射调用该方法?老实说,我想不出任何其他原因导致上述代码不起作用,除非它没有在任何地方显式引用,因此 iOS 编译器正在删除代码,因为它没有被引用以创建尽可能小的可执行文件。
  • 如问题所述,该属性不是通过反射调用的。
猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2015-02-15
  • 2018-10-20
  • 1970-01-01
相关资源
最近更新 更多