2009-10-05 6 views
24

Ich würde gerne wissen, ob es eine Möglichkeit gibt, C# - und Obj-C-Code in einem Projekt zu mischen. Insbesondere möchte ich Cocos2D für meine Benutzeroberfläche in Obj-C verwenden und einige MonoTouch C# -Bibliothek aufrufen, die einige Berechnungen durchführt und einige Werte zurückbekommt. Gibt es eine Möglichkeit, dies zu tun? Oder vielleicht umgekehrt, ich. e. in MonoTouch bauen und Cocos2D-Funktionen aufrufen? Danke.Gibt es eine Möglichkeit, MonoTouch und Objective-C zu mischen?

Antwort

15

Das Setup, das Sie beschreiben, ist möglich, aber die Pipeline ist nicht so flüssig wie bei einem Projekt in MonoTouch. Dies ist genau genommen, wie wir MonoTouch bootstrappten: Wir nahmen ein existierendes Objective-C-Beispiel und ersetzten dann die Bits nacheinander mit verwaltetem Code.

Wir haben diese Proben fallen gelassen, da sie bitrot sind.

Aber Sie können immer noch dies tun, verwenden Sie die Befehlszeilenoption --xcode von mtouch, um ein Beispielprogramm für Sie zu generieren, und kopieren Sie dann die gewünschten Bits aus dem generierten template.m in Ihre main.m. Passen Sie die gewünschten Komponenten an und starten Sie das XCode-Projekt von dort aus.

Während Ihres Entwicklungszyklus, werden Sie weiterhin es mTouch --xcode

+1

Danke! Ich werde es versuchen. –

+1

Vielleicht ist das nicht mehr der beste Weg: [* '--xcode = DIRECTORY' ... Beachten Sie, dass diese Option nicht unterstützt wird und möglicherweise in einer zukünftigen Version von mtouch entfernt wird. *] (Http: // iosapi. xamarin.com/?link=man%3amtouch(1)). Ich glaube, dass Apple die Beschränkungen für interpretierte Sprachen vor einiger Zeit gelockert hat, so dass, wenn Sie den gesamten Code, der mit Ihrem Paket interpretiert werden soll, in Ordnung sind. Dies würde zu dem Schluss führen, dass das Einbetten von Mono und das Aufrufen von Objective-C/Objective-C++ der richtige Weg wäre. –

+1

Miguel: Vielleicht möchten Sie Ihren Beitrag aktualisieren, um anzuzeigen, dass dies nicht mehr möglich ist. –

2

Calling Objective-C von MonoTouch sieht definitiv möglich. Siehe Objective-C selector examples

+0

Ja, ich habe diese Seite auch gesehen, aber das ist zu kompliziert. Am besten ist es wie oben beschrieben mit der GUI in Cocos3D und MonoTouch-Library. Sah auf http://monotouch.net/Documentation/XCode wo Embedding erwähnt wird und auch einen Link zum Mono-Framework, aber weiß nicht, ob das der richtige Weg ist. –

+0

Nun, es klingt wie Einbetten der Mono-VM ist der Weg zu gehen, da es wie eine Bibliothek für Ihre primäre Anwendung fungiert. Die Anweisungen auf dieser Xcode-Seite scheinen ziemlich einfach zu sein. – nall

1

Welche Bibliothek rufen Sie an? Vielleicht gibt es ein Objective-C-Äquivalent.

+0

Es ist eine benutzerdefinierte C# -Bibliothek, die schwierig zu portieren ist. Es kompiliert bereits mit MonoTouch, aber ich brauche eine Möglichkeit, dies mit der Benutzeroberfläche, die in Cocos3D ist, zu integrieren. –

+0

Ich habe nicht gesagt, es zu portieren. Ich habe gefragt, was es tut, denn es gibt eine gute Chance, dass Sie in Objective-C (oder sogar C) eine andere Bibliothek finden, die das tut, was Sie tun möchten. Also, was macht die Bibliothek? –

+0

Sie haben Recht, Sie haben nicht gesagt, es zu portieren. Aber ich denke nicht, dass es ein Obj-C/C-Äquivalent gibt, da diese Bibliothek auf den neuesten Forschungen eines Kollegen basiert. Kurz gesagt, es ist eine Art Argumentationsmotor. Ich denke, wir werden Miguels Vorschlag versuchen. –

6

über das Wochenende verwenden heraus, dass jemand Cocos2D zu .NET portiert gewesen ist, so dass Sie auch die ganze Arbeit auf .NET tun konnten:

http://github.com/city41/CocosNet

Cocos2D begann als Python-Projekt, das in Objective-C wurde später portiert, und jetzt gibt es eine aktive Anstrengung es zu C# zu bringen. Es ist noch nicht fertig, aber der Autor akzeptiert Patches und könnte ein besserer Weg sein.

+0

Großartig, danke! –

+0

Dies ist ein veraltetes Projekt und wurde mehrere Jahre nicht bearbeitet. Schau in cocos2d-x – FlavorScape

10

Re: unbekannt (google):

Wir haben eigentlich diese, wie beschrieben.

Auf dieser Seite finden Sie einen kurzen Überblick, aber das letzte Codesegment auf dieser Seite ist falsch, weil der "--xcode" -Parameter weggelassen wird. http://monotouch.net/Documentation/XCode

Was Sie Ihre Mono-EXE/DLL in eine Objective-C-Programm zu tun hat einzubetten ist Ihre Quelle mit SharpDevelop zu kompilieren, führen Sie dann mTouch mit diesen Parametern:

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

Dies funktioniert nur mit der Vollversion von MonoTouch. Die Testversion erlaubt nicht die Verwendung des "--xcode" -Arguments. Das "--linksdkonly" -Argument wird benötigt, wenn Sie möchten, dass mtouch nicht referenzierte Klassen in der kompilierten Ausgabe behält, andernfalls wird ungenutzter Code entfernt.

Dann kompiliert mtouch Ihre Assembly in nativen ARM-Code (Dateierweiterung .s) und erzeugt auch eine XCode Vorlage, die die Mono-Runtime und Ihren Code in das XCode/ObjC-Programm lädt. Sie können diese Vorlage jetzt sofort verwenden und Ihren Obj-C-Code einbinden oder den Laufzeit-Ladecode aus der "main.m" -Datei extrahieren und in Ihr bestehendes XCode-Projekt einfügen. Wenn Sie ein bestehendes Projekt verwenden, müssen Sie auch alle .exe/.dll/.s Dateien aus dem xcode-output-dir kopieren, das mtouch erstellt hat.

Jetzt haben Sie Ihre Mono-Runtime und Assembly in einem XCode-Projekt geladen.Um mit Ihrer Assembly zu kommunizieren, müssen Sie die Mono-Embedding-API verwenden (nicht Bestandteil von MonoTouch, sondern Mono). Dies sind C-style API-Aufrufe. Für eine gute Einführung siehe this page.

Auch die Mono-Embedding-API documentation könnte hilfreich sein.

Was Sie jetzt in Ihrem Obj-C-Code tun müssen, ist Embedding-API Aufrufe zu machen. Diese Schritte können Folgendes umfassen: Abrufen der Anwendungsdomäne, Abrufen der Assembly, Abrufen des Abbilds der Assembly, Suchen der gewünschten Klasse, Instanziieren eines Objekts aus dieser Klasse, Suchen nach Methoden in der Klasse, Aufrufen von Methoden für Objekt, Einkapseln von Methodenargumenten in C-Arrays und übergeben sie an die Methodenaufruf, erhalten und extrahieren Methoden Rückgabewerte. Es gibt Beispiele dafür auf der obigen embedding-api-doc-Seite.

Sie müssen nur vorsichtig mit dem Speicherverbrauch Ihrer Bibliothek sein, da die Mono-Laufzeit auch etwas Speicher benötigt.

Das ist also der Weg von Obj-C zu C#. Wenn Sie von C#/Mono in Ihr Obj-C-Programm telefonieren möchten, müssen Sie die MonoTouch-Bindings verwenden, die unter here beschrieben sind.

Sie können auch Aufrufe der reinen C-Methode von der embedding/P/Invoke-API verwenden.

Hoffe, dass Sie damit beginnen.