您的当前位置:首页正文

Xamarin.iOS底层架构

来源:华拓网

先看这张图

简单的说,Xamarin.iOS 运行在 Mono 环境中, 借助 AOTC#代码转化为 iOS 执行代码,在整个过程中, AOTObjective-C Runtime 是一对好基友 ,一起卖力的干活,除此之外,他们还有一个共同的上层,那就是 UNIX-like kernel

那么问题来了,什么是 AOT ,它是如何工作的

再来一张图

故事发生在编译的时候, 如果你是 Xamarin.Android, Xamarin.Mac ,或者是运行在模拟器上的 Xamarin.iOS,那么整个流程是这样的

  1. Mono C# (F#) 会将 C# 或者 F# 代码编译成 MSIL(上面提到的Managed Code)

  2. CLR 接手,用一种叫 Just in Time (JIT) 的编译器将 MSIL 编译成各平台能执行的代码

但是!苹果爸爸有诸多限制,譬如他不允许动态生成的代码在 真机上执行, 那么 我们的主角AOT(Ahead of Time) 登场,它做的 就是在步骤二中代替 JITMSIL 编译成 iOS Binary(与此同时,可能会被LLVM 程序优化),这种二进制文件可以被部署到真机上并被执行。

大的方面讲完了, 和 Apple 之间是如何通信的

Selectors
Registrars

到这里为止, 翻译工作已经做好了,那么反过来,Objective-C 怎么读懂 C# 代码并且调用native code,先看一段代码

C# (Managed Code)

class MyViewController : UIViewController{
    [Export ("myFunc")]
    public void MyFunc ()
    {
    }
}

Objective-C

@interface MyViewController : UIViewController { }
-(void)myFunc;
@end

@implementation MyViewController {
-(void) myFunc
{
    /* code to call the managed MyViewController.MyFunc method */
}
@end

registrars有两种类型

  • Dynamic registrars
    用于运行时, 利用的就是OC 的runtime,所以这种方式启动慢,但是build 快,这种适用于模拟器。

  • Static registrars
    用于build时,直接编译为静态库并且链接到可执行文件中,这种启动快,但是build时间久,适用于真机。

参考