Ios System.ExecutionEngineeException:仅在设备(MonoTouch)上的调试模式下尝试JIT编译方法

Ios System.ExecutionEngineeException:仅在设备(MonoTouch)上的调试模式下尝试JIT编译方法,ios,xamarin.ios,jit,aot,Ios,Xamarin.ios,Jit,Aot,我有以下方法: ApiResponse<T> PostMultipart<T>(string uploadUrl, NameValueCollection formParamters, params UploadFile[] uploadFiles); 通过调用该方法,everyhing在带有“Debug | iPhoneSimulator”的模拟器和带有“Release | iPhone”的iOS 5.1.1的iPodtouch上运行良好 但当我开始在设备上调试应用程

我有以下方法:

ApiResponse<T> PostMultipart<T>(string uploadUrl, NameValueCollection formParamters, params UploadFile[] uploadFiles);
通过调用该方法,everyhing在带有“Debug | iPhoneSimulator”的模拟器和带有“Release | iPhone”的iOS 5.1.1的iPodtouch上运行良好

但当我开始在设备上调试应用程序(“调试iPhone”)时,我会遇到以下例外情况:

System.ExecutionEngineeException:仅在使用--aot运行时,尝试JIT编译方法“Xyz.Api.apicClient:PostMultipart(string,System.Collections.Specialized.NameValueCollection,Xyz.Api.UploadFile[])。有关更多信息,请参阅

我在链接页面上看不到任何相关信息。我真的不明白为什么只有在电话调试时才会发生这种行为


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

您的代码样本不够完整(无法复制),但这很可能是因为您的
是一种值类型(例如
int
,enum…)

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

  • 提示AOT编译器您需要什么(确保已知
    ,并为您使用的值类型生成代码)

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

我真的不明白为什么只有在电话调试时才会发生这种行为


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

谢谢,poupou,我会检查一下。奇怪的是,它似乎只出现在手机的调试模式下,而不是在发布模式下(在这两种情况下都应该使用AOT!?)。是的,AOT在这两种情况下(调试和发布模式)都使用。编译后的代码可能会不同(例如,使用
#if DEBUG
),因此可能不是所有情况下都能通过提示?奥托,它也可能是一只虫子。你能创建一个小测试用例并将其附加到poupou的bug报告中吗?你能解释一下如何做这个暗示吗?我有一个例子,所有值类型的代码都是绝对必要的。我认为“暗示”的意思是:
var x=new Foo()
,它可以强制生成
Foo
public class UploadFile
{
    public string FilePath { get; set; }
    public string ContentType { get; set; }
    public string ParameterName { get; set; }
}