我正在使用WebAPI作为Web服务为Android和iOS创建Xamarin.Forms。整个事情在Android上进展顺利,但我在iOS中遇到了错误,尤其是在执行“ JsonConvert.DeserializeObject”时。下面是示例代码
型号
public class WsObjTest
{
public string name { get; set; }
public string code { get; set; }
public string age { get; set; }
}
WebAPI
[HttpGet]
public WsObjTest HelloWorld()
{
WsObjTest wsObjTtest = new WsObjTest();
wsObjTtest.name = "John Doe";
wsObjTtest.code = "ABC123";
wsObjTtest.age = "18";
return wsObjTtest ;
}
在我的Xamarin.Forms中,这就是调用和反序列化响应的方式
HttpClient client = new HttpClient();
var response = await client.GetStringAsync(apiURL.Replace("##action##", "HelloWorld"));
return JsonConvert.DeserializeObject<WsObjTest>(response); //ERROR HERE
我得到了如下响应,但是在return语句上抛出了错误。
“ {\” code \“:\” ABC123 \“,\”名称\“:\” John Doe \“,\”年龄\“:\” 18 \“}”
错误消息在下面
未处理的异常:
System.MemberAccessException:无法创建抽象类: 发生System.Reflection.Emit.DynamicMethod
我认为这是因为iOS不支持JIT编译或某种动态方法吗?我是否可以解决这个错误?谢谢。
答案 0 :(得分:0)
基于https://docs.microsoft.com/en-us/xamarin/ios/internals/limitations,无法在Xamarin.iOS中使用任何需要在运行时生成代码的功能,因为iPhone上的代码是预先静态编译的,而不是JIT编译器按需编译的。
我现在要做的是读取并手动创建对象,如下所示。如果有人得到更好的解决方案,请与我分享。
HttpClient client = new HttpClient();
var response = await client.GetStringAsync(apiURL.Replace("##action##", "HelloWorld"));
JObject jObject = (JObject) JsonConvert.DeserializeObject(response);
WsObjTest wsObjTest = new WsObjTest();
wsObjParent.name = jObject["name"].ToString();
wsObjParent.code = jObject["code"].ToString();
wsObjParent.age = jObject["age"].ToString();
return wsObjTest;
从链接中提取
由于iOS内核阻止 应用程序动态生成代码,Xamarin.iOS不会 支持任何形式的动态代码生成。这些包括:
- System.Reflection.Emit不可用。
- 不支持 System.Runtime.Remoting。
- 不支持动态创建类型(否 Type.GetType(“ MyType`1”)),尽管查找现有类型 (例如,Type.GetType(“ System.String”)可以正常工作)。
- 反向 回调必须在编译时在运行时注册。
因此System.Reflection.Emit发出了我收到的错误。