Может ли приложение iOS XCode ссылаться на сборки MonoTouch?

Я обдумываю, как лучше разделить усилия между командами для нового проекта. У нас есть группа служб приложений Windows C# и небольшая группа iOS Objective-C. Также вероятно, что рано или поздно потребуется приложение для Android.

Сборка уровня домена/API на устройстве, которое вызывает наши службы и обрабатывает синхронизацию с локальным хранилищем данных, является логическим компонентом, который нужно написать на C# и скомпилировать с помощью MonoTouch. Затем команда Objective-C ссылается на этот компонент. Это возможно? Я много читал о MonoTouch, ссылающемся на сборки C, но может ли это работать наоборот?

Было бы здорово услышать о каком-либо опыте использования этого подхода, если это возможно!

Спасибо, Аарон.


person Aaron    schedule 10.03.2011    source источник


Ответы (1)


Хотя это технически возможно, сегодня нет простого способа сделать это.

Лучшее, что вы можете сделать сейчас, это запустить приложение из C#, а затем, если хотите, передать управление вашему коду на Objective-C. Во время запуска C# вы можете зарегистрировать методы, которые будут вызываться кодом Objective-C, используя P/Invoke для вызова чего-то вроде:

delegate void some_callback_t (int parameter1, int parameter2);

[DllImport ("__Internal")]
void SetCallback (some_callback_t callback);

static void mycallback (int parameter1, int parameter2)
{
    // Here goes your C# logic to be called by C
}

Затем вы звоните:

SetCallback (mycallback);

Обратите внимание, что mycallback должен быть статическим методом (ограничение статической компиляции). Затем ваш код Objective-C может потреблять службы, реализуя что-то вроде:

 typedef (*callback_t) (int p1, int p2);
 callback_t callback;
 void SetCallback (callback_t cb)
 {
     callback = cb;
 }

 void InvokeCSharp ()
 {
     callback (1, 2);
 }
person miguel.de.icaza    schedule 10.03.2011
comment
Привет Мигель, спасибо за быстрый ответ. Можно ли также отправлять сложные DTO? Требуется ли специальная сортировка? - Это не похоже на то, что я мог бы убедить нашего гуру iOS использовать. Спасибо - person Aaron; 11.03.2011
comment
DTO = объект передачи данных. В общем, это просто простой объект только со свойствами и без поведения, используемый для отправки данных по разным слоям. - person Eduardo Scoz; 11.03.2011
comment
Спасибо за объяснение, Эдуардо, я начал использовать этот термин только в прошлом году или около того на работе, но он используется часто. - person Aaron; 12.03.2011
comment
Да, вы можете это сделать. Просто используйте стандартные правила P/Invoke. Большая часть MonoTouch построена таким образом, структуры C # представляют собой просто сопоставление 1: 1 с объектами Objective-C, поэтому происходит нулевое копирование / маршаллинг. - person miguel.de.icaza; 12.03.2011