MonoTouch在设备上运行时不支持OpenAsync方法打开web服务连接(在模拟器上工作)

本文关键字:连接 服务 web 模拟器 工作 方法 运行时 不支持 MonoTouch OpenAsync | 更新日期: 2023-09-27 18:09:19

我使用MonoTouch 4.0.7与MonoDevelop 2.8 Beta 2和XCode 4(顺便说一下,有人知道如何获得MonoTouch 4.2版本?)。我们正在尝试通过由slsvcutil代理生成器生成的类调用. net web服务方法。

当在iPhone模拟器上测试应用程序时,代码正在工作,我们成功地连接到服务器并发送web服务请求。

然而,当在设备上测试应用程序时(带有iOS 4.3.5的iPhone 4),当调用OpenAsynch()方法(在代理生成器生成的代码中调用的方法)时,应用程序无法连接到服务器,我们得到一个奇怪的错误:

尝试JIT编译方法'(wrapper delegate-begin-invoke)"(包装delegate-begin-invoke):begin_invoke_IAsyncResult_this__TimeSpan_AsyncCallback_object (System.TimeSpan,System.AsyncCallback,object)'运行时使用——aot-only.

我的错误堆栈:

Unhandled Exception: System.ExecutionEngineException: Attempting to JIT compile method '(wrapper delegate-begin-invoke) <Module>:begin_invoke_IAsyncResult__this___TimeSpan_AsyncCallback_object (System.TimeSpan,System.AsyncCallback,object)' while running with --aot-only.
at System.ServiceModel.MonoInternal.ClientRuntimeChannel.OnBeginOpen (TimeSpan timeout, System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at System.ServiceModel.Channels.CommunicationObject.BeginOpen (TimeSpan timeout, System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at System.ServiceModel.Channels.CommunicationObject.BeginOpen (System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at System.ServiceModel.ClientBase`1+ChannelBase`1[ICommandMgr,ICommandMgr].System.ServiceModel.ICommunicationObject.BeginOpen (System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at System.ServiceModel.ClientBase`
1[ICommandMgr].System.ServiceModel.ICommunicationObject.BeginOpen (System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at CommandMgrClient.OnBeginOpen (System.Object[] inValues, System.AsyncCallback callback, System.Object asyncState) [0x00000] in CommandMgrStaticProxyClient.cs:1156
 at System.ServiceModel.ClientBase`1[ICommandMgr].InvokeAsync (System.ServiceModel.BeginOperationDelegate beginOperationDelegate, System.Object[] inValues, System.ServiceModel.EndOperationDelegate endOperationDelegate, System.Threading.SendOrPostCallback operationCompletedCallback, System.Object userState) [0x00000] in <filename unknown>:0 
at CommandMgrClient.OpenAsync (System.Object userState) [0x00057] in CommandMgrStaticProxyClient.cs:1193 

有人知道如果它是一个MonoTouch错误,或者如果有一个方法来修复这个崩溃?提前感谢!

---- EDIT ----

我找到了一个解决方案:用Open()代替OpenAsync()调用。因此,我认为这是MonoTouch不支持异步调用来打开Web服务连接的限制/缺陷。我将在bugzilla.xamarin.com中输入一个bug

 private void DoNotificationMgrOpenAsync(string address, int port)
{
  this.SystemUIHandler.LogInfo(">>>>>> NotificationMgr Open");
  m_notificationMgrClient = new NotificationMgrClient(
    new System.ServiceModel.BasicHttpBinding() { Namespace = "http://schema.dartfish.com/2011/05/RemoteControl" },
    new System.ServiceModel.EndpointAddress(
      string.Format(System.Globalization.CultureInfo.InvariantCulture, "http://{0}:{1}/Dartfish/RemoteControlServices/",
      address, port)));
  //m_notificationMgrClient.OpenCompleted += new System.EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(NotificationMgrClient_OpenCompleted);
  //m_notificationMgrClient.OpenAsync();
  m_notificationMgrClient.Open();
  DoGetLastMessageId();
}
void NotificationMgrClient_OpenCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
  this.SystemUIHandler.LogInfo("<<<<<< NotificationMgr Open");
  System.Diagnostics.Debug.Assert(m_notificationMgrClient != null);
  if (m_notificationMgrClient != null)
  {
    m_notificationMgrClient.OpenCompleted -= NotificationMgrClient_OpenCompleted;
    // init messageId
    DoGetLastMessageId();
  }
}

MonoTouch在设备上运行时不支持OpenAsync方法打开web服务连接(在模拟器上工作)

我认为具体问题与Unity 3D论坛上的这篇文章相同:

+=事件处理程序语法的AOT问题

在这篇文章中,生成的异步代理代码使用+=事件语法,这需要JIT编译。

我还没有测试过openasync,所以在解决事件处理程序问题后,您可能会遇到额外的困难。

UPDATE

MonoTouch(本身)正在触及MonoTouch的全aot限制之一。

直接的解决方法是使用同步的Open方法(而不是OpenAsync方法)。

打开了一个bug报告来跟踪这个问题。您可以将自己添加到它的 cc中。列表,以更新其进度