【问题标题】:Is there a way to mix MonoTouch and Objective-C?有没有办法混合 MonoTouch 和 Objective-C?
【发布时间】:2009-10-05 20:37:31
【问题描述】:

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

【问题讨论】:

    标签: objective-c xamarin.ios mixing


    【解决方案1】:

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

    我们丢弃了这些样本,因为它们变质了。

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

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

    【讨论】:

    【解决方案2】:

    回复:未知(谷歌):

    我们实际上是按照描述的那样做的。

    请参阅此页面以获得快速入门,但该页面上的最后一个代码段是错误的,因为它省略了“--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 调用。有关详细介绍,请参阅this page

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

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

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

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

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

    希望这能让你开始。

    【讨论】:

      【解决方案3】:

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

      http://github.com/city41/CocosNet

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

      【讨论】:

      • 这是一个已弃用的项目,已经有好几年没有工作了。看看 cocos2d-x
      【解决方案4】:

      从 MonoTouch 调用 Objective-C 看起来确实可行。见Objective-C selector examples

      【讨论】:

      • 是的,我也看到了那个页面,但是那太复杂了。最好使用 Cocos3D 和 MonoTouch-Library 中的 GUI,如上所述。看了monotouch.net/Documentation/XCode,其中提到了嵌入,还有一个指向主要 Mono 框架的链接,但不知道这是否是要走的路。
      • 好吧,听起来嵌入 Mono VM 是可行的方法,因为它就像您的主要应用程序的库一样。 Xcode 页面上的说明看起来很简单。
      【解决方案5】:

      你在调用什么库?也许有一个 Objective-C 等价物。

      【讨论】:

      • 这是一个自定义的 C# 库,很难移植。它已经用 MonoTouch 编译,但我需要一种方法将它与 UI 结合起来,它在 Cocos3D 中。
      • 我没说要移植它。我在问它是做什么的,因为你很有可能在 Objective-C(甚至 C)中找到另一个库来做你想做的事情。那么,图书馆是做什么的呢?
      • 你是对的,你没有说移植它。但我认为没有 Obj-C/C 等价物,因为该库是基于同事最近的研究。简而言之,它是某种推理引擎。我想我们会试试 Miguel 的提议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      相关资源
      最近更新 更多