2009-10-05 4 views
24

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

ответ

15

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

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

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

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

+1

Спасибо! Я попробую. – 2009-10-11 19:15:09

+1

Возможно, это уже не лучший способ: [* '--xcode = DIRECTORY' ... Обратите внимание, что этот параметр не поддерживается и может быть удален в будущей версии mtouch. *] (Http: // iosapi. xamarin.com/?link=man%3amtouch(1)). Я считаю, что Apple некоторое время назад смягчала ограничения на интерпретируемые языки, так что если вы включите весь код, который будет интерпретироваться с вашим пакетом, все в порядке. Это привело бы меня к выводу, что внедрение Mono и вызов его из Objective-C/Objective-C++ - это путь. –

+1

Miguel: вы можете обновить свое сообщение, указав, что это невозможно. –

2

Вызов Objective-C из MonoTouch определенно выглядит возможным. См. Objective-C selector examples

+0

Да, я тоже видел эту страницу, но это слишком сложно. Было бы лучше иметь его, как описано выше, с графическим интерфейсом в Cocos3D и MonoTouch-Library. Посмотрел на http://monotouch.net/Documentation/XCode, где упоминается встраивание, а также ссылка на основную структуру Mono, но не знаю, подходит ли это для этого. – 2009-10-05 22:23:51

+0

Ну, похоже, что вложение Mono VM - это путь, поскольку он действует как библиотека для вашего основного приложения. Направления на этой странице Xcode выглядят довольно просто. – nall

1

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

+0

Это обычная библиотека C#, которую трудно переносить. Он уже компилируется с помощью MonoTouch, но мне нужен способ включить его в пользовательский интерфейс, который находится в Cocos3D. – 2009-10-06 06:13:16

+0

Я не сказал, чтобы портировать его. Я спрашивал, что он делает, потому что есть хороший шанс, что вы можете найти другую библиотеку, которая делает то, что вы хотите сделать, в Objective-C (или даже C). Итак, что делает библиотека? –

+0

Вы правы, вы не сказали, чтобы портировать его. Но я не думаю, что есть эквивалент Obj-C/C, поскольку эта библиотека основана на недавнем исследовании коллеги. В двух словах это какой-то механизм рассуждений. Думаю, мы попробуем предложение Мигеля. – 2009-10-11 19:13:42

6

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

http://github.com/city41/CocosNet

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

+0

Отлично, спасибо! – 2009-10-22 17:17:34

+0

Это устаревший проект и не работал в течение нескольких лет. Посмотрите на cocos2d-x – FlavorScape

10

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-стиля. Для хорошего ознакомления см. this page.

Также может быть полезен Mono-Embedding-API documentation.

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

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

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

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

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

Смежные вопросы