【问题标题】:System.ExecutionEngineException: Attempting to JIT compile method only in Debug Mode on device (MonoTouch)System.ExecutionEngineException:仅在设备上的调试模式下尝试 JIT 编译方法 (MonoTouch)
【发布时间】:2012-10-01 23:55:45
【问题描述】:

我有以下方法:

ApiResponse<T> PostMultipart<T>(string uploadUrl, NameValueCollection formParamters, params UploadFile[] uploadFiles);

UploadFile 只是一个 Poco:

public class UploadFile
{
    public string FilePath { get; set; }
    public string ContentType { get; set; }
    public string ParameterName { get; set; }
}

通过调用该方法,在带有“Debug|iPhoneSimulator”的模拟器和带有“Release|iPhone”的 iOS 5.1.1 的 iPod Touch 上一切正常。

但是当我开始在设备上调试应用程序(“Debug|iPhone”)时,我得到以下异常:

System.ExecutionEngineException:在使用 --aot-only 运行时尝试 JIT 编译方法“Xyz.Api.ApiClient:PostMultipart (string,System.Collections.Specialized.NameValueCollection,Xyz.Api.UploadFile[])”。请参阅http://docs.xamarin.com/ios/about/limitations 了解更多信息。

我在链接页面上看不到任何相关信息。而且我真的不明白为什么只有在手机上调试时才会出现这种行为。

其他人能够理解这里发生了什么吗? :)

【问题讨论】:

    标签: ios xamarin.ios jit aot


    【解决方案1】:

    您的代码示例不够完整(无法复制),但这很可能因为您的&lt;T&gt; 是一个值类型(例如int、枚举...)。 p>

    AOT 编译器难以为无法共享代码的值类型生成代码(就像它可以为任何引用类型一样)。解决方法包括:

    • 提示您需要的 AOT 编译器(确保知道 &lt;T&gt; 并为您正在使用的值类型生成代码);

    • 使用引用类型(例如string)而不是值类型(例如int

    而且我真的不明白为什么这种行为只在手机上调试时才会出现。

    iOS 设备不允许 JITting 代码(Apple 的限制),因此使用 AOT。 iOS模拟器没有这个限制,所以使用JIT(因为它比AOTing代码快很多)。

    【讨论】:

    • 谢谢,poupou,我会检查的。奇怪的是,它似乎只发生在手机的调试模式下,而不是发布模式(这两种情况下都应该使用AOT!?)。
    • 是的,AOT 用于两种情况(调试和发布模式)。编译后的代码可能会有所不同(例如使用#if DEBUG),所以提示可能不是在每种情况下都能通过? OTOH它也可能是一个错误。您能否创建一个小测试用例并将其附加到 bugzilla.xamarin.com 上的错误报告中
    • poupou,你能解释一下如何做这个提示吗?我有一个案例,所有值类型的代码都是绝对必要的。
    • 我认为“暗示”他的意思是:var x = new Foo&lt;Bar&gt;() 可以强制生成Foo&lt;Bar&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多