29

我试图了解 Xamarin.iOS (MonoTouch) 和 Xamarin.Android (Mono for Android) 是如何工作的。我写了一个小应用程序并查看了 .app 和 .apk 文件。

.app 文件 (iOS) 内部有许多 .dll 文件。但为什么?在我读到的每一页和帖子上,他们都说:应用程序是本地执行的,没有任何解释。有人可以向我解释 xamarin 开发人员对“本机”的含义吗?

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

4

3 回答 3

10

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

  • 每一行 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 的评论向我们展示了一些内部实现细节。

于 2013-06-21T03:47:09.160 回答
4

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

  • 单核细胞增多症
  • 本机运行时(Davlik、ART、iOS 运行时)

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

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

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

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

该机制是 Xamarin 中最重要的事情之一。

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

于 2017-06-17T08:11:48.347 回答
1

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

于 2013-06-20T00:47:04.583 回答