先看这张图
简单的说,Xamarin.iOS
运行在 Mono
环境中, 借助 AOT
将 C#
代码转化为 iOS
执行代码,在整个过程中, AOT
和 Objective-C Runtime
是一对好基友 ,一起卖力的干活,除此之外,他们还有一个共同的上层,那就是 UNIX-like kernel
。
那么问题来了,什么是 AOT ,它是如何工作的
再来一张图故事发生在编译的时候, 如果你是 Xamarin.Android
, Xamarin.Mac
,或者是运行在模拟器上的 Xamarin.iOS
,那么整个流程是这样的
-
Mono C# (F#)
会将 C# 或者 F# 代码编译成MSIL
(上面提到的Managed Code) -
CLR
接手,用一种叫Just in Time (JIT)
的编译器将MSIL
编译成各平台能执行的代码
但是!苹果爸爸有诸多限制,譬如他不允许动态生成的代码在 真机上执行, 那么 我们的主角AOT(Ahead of Time)
登场,它做的 就是在步骤二中代替 JIT
将 MSIL
编译成 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时间久,适用于真机。