有没有一种方法可以混合使用MonoTouch和Objective-C?

24

我想知道是否有一种方法可以在一个项目中混合使用C#和Obj-C代码。具体而言,我想在Obj-C中使用Cocos2D作为我的UI,并调用一些执行计算并获取一些返回值的MonoTouch C#库。有没有办法做到这一点?或者反过来,即在MonoTouch中构建并调用Cocos2D函数? 谢谢。

5个回答

15
您所描述的设置是可行的,但与在MonoTouch中完成整个项目时相比,流程不够顺畅。实际上,这就是我们启动MonoTouch的方式:我们使用现有的Objective-C示例,然后逐个用托管代码替换其中的部分。
由于这些示例已经过时,因此我们已经放弃了它们。但您仍然可以完成此操作,使用mtouch的--xcode命令行选项为您生成一个示例程序,然后将你想要的部分从生成的template.m复制到main.m中。自定义所需组件,然后从那里开始启动XCode项目。
在开发周期中,您将继续使用mtouch --xcode。

1
也许这不再是最佳的方法:--xcode=DIRECTORY ... 请注意,此选项不受支持,并且可能会在未来版本的 mtouch 中被移除。。我相信苹果前段时间放宽了对解释性语言的限制,只要您将所有将要解释的代码与包一起打包即可。这导致我得出结论,嵌入 Mono 并从 Objective-C/Objective-C++ 调用它是正确的方法。 - ta.speot.is
1
Miguel:你可能想要更新你的帖子,以表明这已经不再可能了。 - Rolf Bjarne Kvinge

10

关于未知问题(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”参数。如果要让mtouch保留编译输出中未引用的类,则需要使用“--linksdkonly”参数,否则它会剥离未使用的代码。
然后,mtouch将您的程序集编译成本机ARM代码(文件扩展名为 .s),并生成一个XCode模板,该模板加载了Mono-Runtime和您的代码,然后插入到XCode/ObjC程序内部。现在你可以立即使用这个模板,并包含你的Obj-C代码,或从“main.m”文件中提取运行时加载代码,并将其插入到现有的XCode项目中。如果您使用现有的项目,则还必须复制mtouch生成的所有.exe/.dll/.s文件。
现在,您的Mono-Runtime和程序集已经加载到XCode项目中。要与您的程序集通信,您必须使用Mono-Embedding-API(不是MonoTouch的一部分,而是Mono)。这些是C样式的API调用。有关良好介绍,请参见此页面Mono嵌入式API文档也可能很有帮助。
现在在您的Obj-C代码中所要做的就是进行嵌入式API调用。这些步骤可能涉及:获取应用程序域,获取程序集,获取程序集的映像,定位要使用的类,从该类实例化一个对象,在类中查找方法,在对象上调用方法,将方法参数封装在C数组中并将其传递给方法调用,获取和提取方法返回值。在嵌入API文档页上有此类示例。
您只需注意库的内存消耗,因为Mono运行时也需要一些内存。
所以这就是从Obj-C到C#的方式。如果您想从C#/Mono调用您的Obj-C程序,则必须使用MonoTouch绑定,这些绑定在此处进行了描述。
您还可以使用嵌入/ P / Invoke-API的纯C方法调用。
希望这能为您提供起点。

6

最近有消息称,有人正在将Cocos2D移植到.NET平台,因此您也可以在.NET上完成整个工作:

http://github.com/city41/CocosNet

Cocos2D最初是一个Python项目,后来被移植到Objective-C,并现在正在积极努力将其引入C#。它尚未完成,但作者正在接受补丁并可能开辟更好的前进之路。

这是一个已经被弃用的项目,已经好几年没有更新了。建议使用cocos2d-x。 - FlavorScape

2

是的,我也看过那个页面,但那太复杂了。最好按照上面描述的使用Cocos3D和MonoTouch-Library的GUI来实现。我查看了http://monotouch.net/Documentation/XCode,其中提到了嵌入,并且还有一个链接指向主要的Mono框架,但不知道这是否是正确的方法。 - Kenny
嗯,听起来嵌入Mono VM是正确的方法,因为它就像你主要应用程序的库一样。那个Xcode页面上的说明似乎非常简单明了。 - nall

1
你在调用哪个库?也许有一个 Objective-C 的等效库。

这是一个定制的C#库,很难移植。它已经可以在MonoTouch上编译,但我需要一种将其与Cocos3D中的UI结合起来的方法。 - Kenny
我并没有说要移植它。我是在问它的功能,因为很有可能你可以在Objective-C(甚至C)中找到另一个能够实现你想要的功能的库。那么,这个库具体是做什么的呢? - Kendall Helmstetter Gelner
你说得对,你没有说要移植它。但是我认为没有 Obj-C/C 的等效物,因为那个库是基于同事最近的研究开发的。简而言之,它是某种推理引擎。我想我们将尝试米格尔的建议。 - Kenny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接