24

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

4

5 回答 5

15

您描述的设置是可能的,但管道不如您在 MonoTouch 中完成整个项目时那样顺畅。事实上,这就是我们引导 MonoTouch 的方式:我们采用现有的 Objective-C 示例,然后用托管代码逐位替换这些位。

我们丢弃了这些样本,因为它们会腐烂。

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

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

于 2009-10-10T17:26:14.507 回答
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”-argument。如果您希望 mtouch 在编译的输出中保留未引用的类,则需要“--linksdkonly”-参数,否则它会删除未使用的代码。

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

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

Mono-Embedding-API 文档也可能会有所帮助。

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

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

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

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

希望这能让你开始。

于 2010-01-17T14:32:32.210 回答
6

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

http://github.com/city41/CocosNet

Cocos2D 最初是一个 Python 项目,后来被移植到 Objective-C,现在正在积极努力将其引入 C#。它还没有完成,但作者正在接受补丁,这可能是一个更好的前进方式。

于 2009-10-19T19:45:25.043 回答
2

从 MonoTouch 调用 Objective-C 看起来确实可行。查看Objective-C 选择器示例

于 2009-10-05T22:16:00.793 回答
1

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

于 2009-10-05T22:36:15.260 回答