Xamarin iOS和Android如何运作?

时间:2013-06-19 20:54:32

标签: android ios mono xamarin

我尝试了解Xamarin.iOS(MonoTouch)和Xamarin.Android(Android版Mono)的工作原理。 我写了一个小应用程序并查看了.app和.apk文件。

.app文件(iOS)内部有许多.dll文件。但为什么? 在我阅读的每一页和帖子上,他们都说:App是原生的,没有任何解释。 有人可以向我解释一下xamarin开发人员对“原生”的意思吗?

.apk文件内部不是单个.dll文件..

3 个答案:

答案 0 :(得分:10)

Xamarin对“native”的定义包括但不限于:

  • 每行C#代码都编译为机器代码,然后打包在.app中。运行时没有JIT,因为它被AOT抑制。更多信息可以在
  • 找到

http://www.mono-project.com/AOT

(请注意,Xamarin.Android仍然使用JIT,http://xamarin.com/how-it-works

  • 对平台原生类型/ API的访问是完全开放的,因此您不仅限于一小组API调用(如果您使用HTML5 / JavaScript,您知道存在哪些限制)。

  • 您设计的用户界面绑定到iOS(CocoaTouch)或Android(Skia)公开的本机API。没有中间层可以伤害性能或外观。

至于什么是.ipa或.apk,谁在乎呢?当然,@ Jason的评论向我们展示了一些内部实现细节。

答案 1 :(得分:4)

首先,Xamarin同时在两个不同的运行时工作:

  • 原生运行时(Davlik,ART,iOS运行时)

一些例子。在Visual Studio中创建自己的C#类时,此类的实例将在Mono下运行。此外,当您从nuget下载Newton.Json软件包时,这也将在Mono中运行。这就是为什么我们可以使用所有很酷的.NET东西的原因。但是,当您从Java.Lang.Object(Android)或NSObject(iOS)继承或创建自定义控件时,这些类的实例将在本机运行时下运行。

其次,您可以注意到我们需要以某种方式绑定这两个世界。让我们来看看我们有什么类型的对象。

  • 托管对象(Mono)
  • 无敌物体(原生世界)
  • 对等对象(Mono,作为本机对象包装器的对象)

Peer对象是Xamarin SDKs类的实例(例如活动,视图控件,UILabels,TextViews等),您自己的实例继承自Java.Lang.Object,NSObject,Fragment甚至UISegment类

这种机制是Xamarin最重要的事情之一。

PS:实际上,对于Xamarin项目JIT或AOT,我们使用哪种编译无关紧要。它取决于平台,允许/不允许来自.NET世界的某些功能。这并没有描述Xamarin的工作原理。

答案 2 :(得分:1)

Xamarin编译器捆绑.NET运行时并输出本机(二进制)ARM可执行文件,打包为iOS或Android应用程序。