Есть ли способ смешать MonoTouch и Objective-C? - PullRequest
24 голосов
/ 06 октября 2009

Я хотел бы знать, есть ли способ смешать код C # и Obj-C в одном проекте. В частности, я хотел бы использовать Cocos2D для своего пользовательского интерфейса в Obj-C и вызвать библиотеку MonoTouch C #, которая выполняет некоторые вычисления и возвращает некоторые значения. Есть ли способ сделать это? Или, может быть, наоборот. е. встраивать в MonoTouch и вызывать Cocos2D-функции? Спасибо.

Ответы [ 5 ]

15 голосов
/ 10 октября 2009

Настройка, которую вы описываете, возможна, но конвейер не такой гладкий, как при выполнении всего проекта в MonoTouch.Фактически, это то, как мы загрузили MonoTouch: мы взяли существующий образец Objective C и затем заменили биты один за другим на управляемый код.

Мы отбросили эти сэмплы, так как они являются bitrot.

Но вы все равно можете это сделать, используя опцию командной строки mtouch --xcode, чтобы сгенерировать образец программы для вас, а затем скопировать биты.что вы хотите от сгенерированного template.m в ваш main.m.Настройте нужные компоненты и просто запустите проект XCode оттуда.

Во время цикла разработки вы продолжите использовать mtouch --xcode

10 голосов
/ 17 января 2010

Re: неизвестно (Google):

Мы действительно сделали это, как описано.

Смотрите эту страницу для быстрого запуска, но последний сегмент кода на этой странице неверен, потому что в нем пропущен параметр "--xcode". http://monotouch.net/Documentation/XCode

Чтобы встроить Mono-EXE / DLL в программу Objective-C, вам нужно скомпилировать исходный код с помощью SharpDevelop, а затем запустить mtouch со следующими параметрами:

/Developer/MonoTouch/usr/bin/mtouch --linksdkonly --xcode=output_dir MyMonoAssembly.exe

Это работает только с полной версией MonoTouch. Пробная версия не позволяет использовать аргумент "--xcode". Аргумент "--linksdkonly" необходим, если вы хотите, чтобы mtouch сохранял классы без ссылок в скомпилированном выводе, в противном случае он удаляет неиспользуемый код.

Затем mtouch компилирует вашу сборку в собственный ARM-код (расширение файла .s), а также генерирует шаблон XCode, который загружает Mono-Runtime и ваш код в XCode / ObjC-программу. Теперь вы можете сразу использовать этот шаблон и включить свой код Obj-C или извлечь код загрузки во время выполнения из файла "main.m" и вставить его в существующий проект XCode. Если вы используете существующий проект, вам также необходимо скопировать все файлы .exe / .dll / .s из каталога xcode-output-dir, созданного mtouch.

Теперь у вас есть Mono-Runtime и сборка, загруженные в XCode-проект. Для связи со своей сборкой вы должны использовать Mono-Embedding-API (не часть MonoTouch, а Mono). Это вызовы API в стиле C. Хорошее введение см. на этой странице .

Также может быть полезна документация Mono-Embedding-API .

В вашем Obj-C-коде теперь нужно выполнять вызовы Embedded-API. Эти шаги могут включать: получить домен приложения, получить сборку, получить образ сборки, найти класс, который вы хотите использовать, создать экземпляр объекта из этого класса, найти методы в классе, вызвать методы объекта, инкапсулировать аргументы метода в C-массивы и передать их в вызов метода, получить и извлечь возвращаемые значения метода. Для этого есть примеры на странице embedding-api-doc.

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

Так что это путь от Obj-C до C #. Если вы хотите совершать вызовы из C # / Mono в вашу Obj-C-программу, вы должны использовать привязки MonoTouch, которые описаны здесь .

Вы также можете использовать чистые вызовы C-метода из API встраивания / P / Invoke.

Надеюсь, это поможет вам.

6 голосов
/ 19 октября 2009

В выходные выяснилось, что кто-то портирует Cocos2D на .NET, поэтому вы также можете выполнить всю работу на .NET:

http://github.com/city41/CocosNet

Cocos2D начинался как проект Python, который позже был портирован на Objective-C, и сейчас предпринимаются активные усилия для его переноса на C #. Он еще не закончен, но автор принимает исправления и может быть лучшим способом продвижения вперед.

2 голосов
/ 06 октября 2009

Вызов Objective-C из MonoTouch определенно выглядит возможным. См. Примеры селектора Objective-C

1 голос
/ 06 октября 2009

Из какой библиотеки вы звоните? Возможно, есть эквивалент Objective-C.

...