有没有办法混合MonoTouch和Objective-C?

时间:2009-10-05 20:37:31

标签: objective-c xamarin.ios mixing

我想知道是否有办法在一个项目中混合使用C#和Obj-C代码。具体来说,我想在Obj-C中使用Cocos2D作为我的UI,并调用一些MonoTouch C#-Library进行一些计算并获得一些值。有没有办法做到这一点?或者反过来说,我。即在MonoTouch中构建并调用Cocos2D函数? 感谢。

5 个答案:

答案 0 :(得分:15)

您描述的设置是可能的,但是管道不像在MonoTouch中执行整个项目时那样平滑。这实际上是我们引导MonoTouch的方式:我们采用了现有的Objective-C示例,然后我们用托管代码逐个替换这些位。

我们把这些样品掉了下来。

但是你仍然可以完成这项工作,使用mtouch的--xcode命令行选项为你生成一个示例程序,然后将你想要的位从生成的template.m复制到main.m.自定义所需的组件,然后从那里启动XCode项目。

在开发周期中,您将继续使用mtouch --xcode

答案 1 :(得分:10)

回复:未知(谷歌):

我们实际上按照描述做了这个。

请参阅此页面以快速入门,但该页面上的最后一个代码段是错误的,因为它省略了“--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” - 参数。如果你想让mtouch在编译输出中保留未引用的类,则需要“--linksdkonly”-argument,否则它会删除未使用的代码。

然后mtouch将您的程序集编译为本机ARM代码(文件扩展名.s),并生成一个XCode模板,用于在XCode / ObjC程序中加载Mono-Runtime和您的代码。您现在可以立即使用此模板并包含您的Obj-C代码或从“main.m”文件中提取运行时加载代码并将其插入到现有的XCode项目中。如果您使用现有项目,还必须从mtouch所做的xcode-output-dir中复制所有.exe / .dll / .s文件。

现在,您已在XCode项目中加载了Mono-Runtime和程序集。要与程序集通信,您必须使用Mono-Embedding-API(不是MonoTouch的一部分,而是Mono)。这些是C风格的API调用。有关详细介绍,请参阅this page

此外,Mono-Embedding-API documentation可能会有所帮助。

现在你在Obj-C代码中要做的就是进行Embedding-API调用。这些步骤可能涉及:获取应用程序域,获取程序集,获取程序集的映像,找到要使用的类,从该类实例化对象,在类中查找方法,在对象上调用方法,在方法中封装方法参数C数组并将它们传递给方法调用,获取和提取方法返回值。 在上面的embedding-api-doc页面上有这方面的例子。

你只需要小心你的库的内存消耗,因为单声道运行时也需要一些内存。

所以这是从Obj-C到C#的方式。如果你想从C#/ Mono调用你的Obj-C程序,你必须使用MonoTouch绑定,这些绑定描述为here

您还可以使用嵌入/ P / Invoke-API中的纯C方法调用。

希望这能让你开始。

答案 2 :(得分:6)

上周末发现有人将Cocos2D移植到.NET,所以你也可以在.NET上完成整个工作:

http://github.com/city41/CocosNet

Cocos2D最初是一个Python项目,后来被移植到Objective-C,现在正积极地将它带到C#。它尚未完成,但作者正在接受补丁,可能是更好的前进方式。

答案 3 :(得分:2)

从MonoTouch调用Objective-C绝对是可能的。请参阅Objective-C selector examples

答案 4 :(得分:1)

你打电话给哪个图书馆?也许有一个Objective-C等价物。