MonoTouch神秘地不是编译方法和属性?

时间:2012-04-13 21:29:46

标签: c# xamarin.ios jit aot

我有一个奇怪的问题,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

2 个答案:

答案 0 :(得分:1)

这看起来不像是可以解决的问题。

我建议提交一个错误,如果你不能做一个较小的测试用例,请附上整个项目。如果您不希望公开显示您的项目,则只能提交Xamarin员工可以访问的私有错误。

答案 1 :(得分:0)

您可以尝试显式声明变量

UINavigationController navController = myClass.NavController;

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

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