我尝试了解Xamarin.iOS(MonoTouch)和Xamarin.Android(Android版Mono)的工作原理。 我写了一个小应用程序并查看了.app和.apk文件。
.app文件(iOS)内部有许多.dll文件。但为什么? 在我阅读的每一页和帖子上,他们都说:App是原生的,没有任何解释。 有人可以向我解释一下xamarin开发人员对“原生”的意思吗?
.apk文件内部不是单个.dll文件..
答案 0 :(得分:10)
Xamarin对“native”的定义包括但不限于:
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同时在两个不同的运行时工作:
一些例子。在Visual Studio中创建自己的C#类时,此类的实例将在Mono下运行。此外,当您从nuget下载Newton.Json软件包时,这也将在Mono中运行。这就是为什么我们可以使用所有很酷的.NET东西的原因。但是,当您从Java.Lang.Object(Android)或NSObject(iOS)继承或创建自定义控件时,这些类的实例将在本机运行时下运行。
其次,您可以注意到我们需要以某种方式绑定这两个世界。让我们来看看我们有什么类型的对象。
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应用程序。