Подтвердить что ты не робот

Есть ли способ смешать MonoTouch и Objective-C?

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

4b9b3361

Ответ 1

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

Мы сбросили эти образцы, поскольку они биттро.

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

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

Ответ 2

Re: unknown (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-коде, это сделать вызовы Embedding-API. Эти шаги могут включать: Получить домен приложения, получить сборку, получить изображение сборки, найти класс, который вы хотите использовать, создать экземпляр объекта из этого класса, найти методы в классе, вызвать методы на объекте, инкапсулировать аргументы метода в C-массивы и передать их методу-вызову, получить и извлечь возвращаемые значения метода. Для этого есть примеры для этого на встраивании-api-doc-странице выше.

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

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

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

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

Ответ 3

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

http://github.com/city41/CocosNet

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

Ответ 5

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