2009-10-05 7 views
24

Me gustaría saber si hay una manera de mezclar el código C# y Obj-C en un proyecto. Específicamente, me gustaría utilizar Cocos2D para mi UI en Obj-C y llamar a alguna MonoTouch C# -Library que hace algunos cálculos y recupera algunos valores. ¿Hay alguna forma de hacer esto? O tal vez al revés, yo. mi. ¿construyendo en MonoTouch y llamando a las funciones de Cocos2D? Gracias.¿Hay alguna manera de mezclar MonoTouch y Objective-C?

Respuesta

15

La configuración que describa es posible, pero la interconexión no es tan fluida como cuando hace todo su proyecto en MonoTouch. De hecho, así es como arrancamos MonoTouch: tomamos una muestra existente de Objective-C y luego reemplazamos los bits uno a uno con código administrado.

Dejamos caer esas muestras mientras bitrot.

Pero aún puede hacerlo, use la opción de línea de comando mtouch --xcode para generar un programa de muestra para usted, y luego copie los bits que desee de la plantilla.m generada en su main.m. Personalice los componentes que desee y simplemente inicie el proyecto XCode desde allí.

Durante su ciclo de desarrollo, se seguirá utilizando --xcode mTouch

+1

¡Gracias! Lo intentaré. –

+1

Quizás esta ya no sea la mejor manera: [* '--xcode = DIRECTORIO' ... Tenga en cuenta que esta opción no es compatible, y puede eliminarse en una versión futura de mtouch. *] (Http: // iosapi. xamarin.com/?link=man%3amtouch(1)). Creo que Apple relajó las restricciones sobre los idiomas interpretados hace un tiempo, de modo que si incluye todo el código que se interpretará con su paquete, está bien. Esto me llevaría a la conclusión de que incrustar Mono y llamarlo desde Objective-C/Objective-C++ sería el camino a seguir. –

+1

Miguel: es posible que desee actualizar su publicación para indicar que esto ya no es posible. –

2

Llamar a Objective-C desde MonoTouch definitivamente parece posible. Consulte Objective-C selector examples

+0

Sí, también vi esa página, pero eso es demasiado complicado. Sería mejor tenerlo como se describió anteriormente con GUI en Cocos3D y MonoTouch-Library. Miró http://monotouch.net/Documentation/XCode donde se menciona incrustación y también un enlace al marco principal de Mono, pero no sé si este es el camino a seguir. –

+0

Bueno, parece que la incorporación de Mono VM es el camino a seguir, ya que actúa como una biblioteca para su aplicación principal. Las instrucciones en esa página de Xcode parecen bastante sencillas. – nall

1

¿A qué biblioteca está llamando? Quizás haya un equivalente de Objective-C.

+0

Es una biblioteca personalizada de C#, que es difícil de portar. Ya compila con MonoTouch, pero necesito una forma de incorporar esto con la interfaz de usuario, que está en Cocos3D. –

+0

No dije portarlo. Estaba preguntando qué hace, porque hay muchas posibilidades de que pueda encontrar otra biblioteca que haga lo que quiere hacer, en Objective-C (o incluso C). Entonces, ¿qué hace la biblioteca? –

+0

Tienes razón, no dijiste para portarlo. Pero no creo que haya un equivalente Obj-C/C, ya que esa biblioteca se basa en investigaciones recientes de un colega. En pocas palabras, es una especie de motor de razonamiento. Creo que probaremos la propuesta de Miguel. –

6

El fin de semana se supo que alguien ha sido portar Cocos2D a .NET, por lo que también podría hacer todo el trabajo en .NET:

http://github.com/city41/CocosNet

Cocos2D comenzó como un proyecto de Python, que más tarde se consiguió portado a Objective-C, y ahora hay un esfuerzo activo para llevarlo a C#. No está terminado, pero el autor está aceptando parches y podría ser una mejor manera de avanzar.

+0

¡Genial, gracias! –

+0

Este es un proyecto en desuso y no se ha trabajado durante varios años. Mira en cocos2d-x – FlavorScape

10

Re: desconocido (Google):

En realidad no esta como se describe.

Consulte esta página para un inicio rápido, pero el último segmento de código en esa página es incorrecto, porque omite el parámetro "--xcode". http://monotouch.net/Documentation/XCode

Lo que tienes que hacer para incrustar el Mono-EXE/DLL en un Objective-C programa es compilar las fuentes con SharpDevelop, a continuación, ejecutar mTouch con estos parámetros:

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

Esto sólo funciona con la versión completa de MonoTouch. La versión de prueba no permite usar el argumento "--xcode". El argumento "--linksdkonly" es necesario si desea que mtouch mantenga clases sin referencia en el resultado compilado, de lo contrario, elimina el código no utilizado.

Luego mtouch compila su ensamblaje en código ARM nativo (extensión de archivo .s) y también genera una plantilla XCode que carga el Mono-Runtime y su código dentro del programa XCode/ObjC. Ahora puede usar esta plantilla de inmediato e incluir su código Obj-C o extraer el código de carga en tiempo de ejecución del archivo "main.m" e insertarlo en su proyecto XCode existente. Si utiliza un proyecto existente, también tiene que copiar todos los archivos .exe/.dll/.s del xcode-output-dir que mtouch realizó.

Ahora tiene su Mono-Runtime y el ensamblaje cargado en un proyecto XCode.Para comunicarse con su ensamblado, debe usar la API Mono-Embedding (que no es parte de MonoTouch, sino de Mono). Estas son llamadas a la API estilo C. Para una buena introducción, vea this page.

También el Mono-Embedding-API documentation podría ser útil.

Lo que tienes que hacer ahora en tu código Obj-C es hacer llamadas Embedding-API. Estos pasos pueden implicar: Obtener el dominio de la aplicación, obtener el ensamblado, obtener la imagen del ensamblaje, ubicar la clase que desea usar, crear instancias de un objeto de esa clase, buscar métodos en clase, llamar a métodos en objetos, encapsular argumentos de métodos en C-arrays y pasarlos a method-call, get y extract return values ​​values. Hay ejemplos de esto en la página de incrustación-api-doc anterior.

Solo tiene que tener cuidado con el consumo de memoria de su biblioteca, ya que el tiempo de ejecución mono también consume algo de memoria.

Este es el camino de Obj-C a C#. Si desea realizar llamadas desde C#/Mono a su programa Obj-C, debe usar las vinculaciones MonoTouch, que se describen en here.

También podría usar llamadas de método C puro desde la incrustación/P/Invoke-API.

Espero que esto comience.

Cuestiones relacionadas