我试图了解 Xamarin.iOS (MonoTouch) 和 Xamarin.Android (Mono for Android) 是如何工作的。我写了一个小应用程序并查看了 .app 和 .apk 文件。
.app 文件 (iOS) 内部有许多 .dll 文件。但为什么?在我读到的每一页和帖子上,他们都说:应用程序是本地执行的,没有任何解释。有人可以向我解释 xamarin 开发人员对“本机”的含义吗?
.apk 文件内部不是单个 .dll 文件。
Xamarin 对“本机”的定义包括但不限于:
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 的评论向我们展示了一些内部实现细节。
首先,Xamarin 同时在两个不同的运行时上工作:
一些例子。在 Visual Studio 中创建自己的 C# 类时,此类的实例将在 Mono 下运行。此外,当您从 nuget 下载 Newton.Json 包时,它也将在 Mono 中运行。这就是为什么我们可以使用所有很酷的 .NET 东西的原因。但是,当您从 Java.Lang.Object (Android) 或 NSObject (iOS) 继承或制作自定义控件时,这些类的实例将在本机运行时运行。
其次,你可以注意到我们需要以某种方式绑定这两个世界。让我们看看我们有哪些类型的对象。
对等对象是 Xamarin SDK 类的实例(例如活动、视图控件、UILabels、TextViews 等),您自己的从 Java.Lang.Object、NSObject、Fragment 甚至 UISegment 类继承的实例。
该机制是 Xamarin 中最重要的事情之一。
PS:实际上,对于 Xamarin 项目 JIT 或 AOT,我们使用哪种编译并不重要。它取决于平台并允许/不允许来自 .NET 世界的某些功能。这并没有描述 Xamarin 的工作原理。
Xamarin 编译器捆绑 .NET 运行时并输出本机(二进制)ARM 可执行文件,打包为 iOS 或 Android 应用程序。