2

我正在使用安装了 iOS 6.4.4 更新的 Xamarin (MAC)。我的触摸项目使用启用了 HttpClient 的 PCL 库。每次我执行使用 HttpClient 的方法时,都会出现以下运行时错误:

System.ExecutionEngineException: Attempting to JIT compile method '(wrapper delegate-invoke) <Module>:invoke_void__this___HttpWebRequest_long (System.Net.HttpWebRequest,long)' while running with --aot-only. See http://docs.xamarin.com/ios/about/limitations for more information.

  at System.Lightup.Call[HttpWebRequest,Int64] (System.Delegate& storage, System.Net.HttpWebRequest instance, System.String methodName, Int64 parameter) [0x00000] in <filename unknown>:0 
  at System.Lightup.Set[HttpWebRequest,Int64] (System.Delegate& storage, System.Net.HttpWebRequest instance, System.String propertyName, Int64 value) [0x00000] in <filename unknown>:0 
  at System.Net.HttpWebRequestLightup.SetContentLength (System.Net.HttpWebRequest instance, Int64 value) [0x00000] in <filename unknown>:0 
  at System.Net.Http.HttpWebRequest.set_ContentLength (Int64 value) [0x00000] in <filename unknown>:0 
  at System.Net.Http.HttpClientHandler.StartRequest (System.Object obj) [0x00000] in <filename unknown>:0

我该如何解决这个问题?

4

2 回答 2

1

我知道我迟到了将近 3 年 :) 但今天我遇到了这个问题。现在支持 PCL,所以我认为向这个问题添加一些额外的信息可能会有所帮助。

如果您在 PCL 项目中引用 System.Net.Http,例如使用 Microsoft.Net.Http NuGet 包,则必须将该引用也添加到您的 iOS 项目中。你也可以通过在你的 iOS 项目上安装这个 NuGet 包来简单地做到这一点。

这将迫使 iOS 项目使用 System.Net.Http dll 的 Mono iOS 版本,而不是 PCL 的变体,这可能是 net45 或类似的东西。

我认为出现这个问题是因为 System.Net.Http 的 net45 变体使用反射来调用某些方法。请注意,错误表明尝试了某些调用,并且这需要 JIT 编译。然而,这在 iOS 物理设备上是禁止的,而不是在 iOS 模拟器上。iOS 物理设备需要 Ahead of Time(aot) 编译。

Attempting to JIT compile method '(wrapper delegate-invoke) <Module>:invoke_callvirt_void_HttpWebRequest_bool (System.Net.HttpWebRequest,bool)'
于 2016-08-17T09:20:41.310 回答
0

PCL 仍不受官方支持。特别是在涉及异步/等待时。同时,您可以了解我为什么这样做并创建一个特定于平台的类库并将您的源文件添加为链接(如果您将文件从 Windows 资源管理器 ALT 拖动到 VS 解决方案资源管理器,并且 Xamarin Studio 自动提供链接选项,Visual Studio 会这样做当它看到目标项目之外的源文件时)。

于 2013-09-07T08:56:10.467 回答