MonoTouch не поддерживает метод OpenAsync для открытия подключения к веб-службе при работе на устройстве (работает на симуляторе).

Я использую MonoTouch 4.0.7 с MonoDevelop 2.8 Beta 2 и XCode 4 (кстати, кто-то знает, как получить версию MonoTouch 4.2?). Мы пытаемся вызвать метод веб-службы .Net через классы, сгенерированные генератором прокси slsvcutil.

При тестировании приложения на симуляторе iPhone код работает, и нам удается подключиться к серверу и отправить запросы веб-сервисов.

Однако при тестировании приложения на устройстве (iPhone 4 с iOS 4.3.5) приложение не может подключиться к серверу при вызове метода OpenAsynch() (метод вызывается в коде, сгенерированном генератором прокси), мы получаем странное ошибка:

Попытка JIT-компиляции метода '(делегат-оболочка-begin-invoke) '(делегат-оболочка-begin-invoke) :begin_invoke_IAsyncResult_этот__TimeSpan_AsyncCallback_object (System.TimeSpan,System.AsyncCallback,object)' во время работы с - -aot-только.

Мой стек ошибок:

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 или есть способ исправить этот сбой? Заранее спасибо!

---- РЕДАКТИРОВАТЬ ----

Я нашел обходной путь: замените вызов OpenAsync() на Open(). Таким образом, я думаю, что это ограничение/ошибка MonoTouch, которая не поддерживает асинхронный вызов для открытия соединения с веб-службой. Я введу ошибку в bugzilla.xamarin.com

 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();
  }
}

person Nicolas    schedule 21.09.2011    source источник


Ответы (2)


Я считаю, что конкретная проблема такая же, как в этом сообщении с форума Unity 3D:

Проблема AOT с синтаксисом обработчика событий +=

Как и в этом посте, сгенерированный асинхронный прокси-код использует синтаксис события +=, который требует JIT-компиляции. Я подтвердил, что исправление в сообщении решает эту проблему.

Я не тестировал OpenAsyc, поэтому вы можете столкнуться с дополнительными трудностями после решения проблемы с обработчиком событий.

person afreedm1    schedule 15.11.2012

ОБНОВЛЕНИЕ

MonoTouch (сам по себе) сталкивается с одним из полных AOT ограничений MonoTouch.

немедленный обходной путь заключается в использовании синхронного метода Open (вместо метода OpenAsync).

Для отслеживания этой проблемы был открыт отчет об ошибке. Вы можете добавить себя в его список c.c., чтобы быть в курсе его хода.

person poupou    schedule 21.09.2011
comment
Неа. Сборки Link SDK в моем случае не помогают. В любом случае спасибо за быстрый ответ. - person Nicolas; 21.09.2011