Xamarin是否将Forms应用程序转换为Java?如果没有,那么它如何在Android上运行?

时间:2019-04-26 12:11:36

标签: xamarin xamarin.forms

我有一个Forms应用程序,我对它如何在我理解使用Swift的iOS和我认为是Java的Android上运行感到困惑。

谁能解释C#代码发生了什么以及如何在这两个平台上运行共享代码?

2 个答案:

答案 0 :(得分:0)

  

它运行在我理解使用Swift的iOS以及我认为是Java的Android

您过于简化了这些操作系统的内部工作。最后,iOS基于Darwin内核,而Linux基于Linux。就设备而言,他们可以运行任何东西。苹果和谷歌分别在Swift和Java中提供功能齐全的API,以与操作系统的低级内部进行通信。这不会阻止任何人以不同的编程语言(例如C#)在这些SDK之上构建自己的SDK。如果需要原始速度,也可以在两个平台上运行C代码。

如果您想了解更多有关其工作原理的信息(iOS和Android的内部原理有所不同),请点击以下链接:https://docs.microsoft.com/en-us/xamarin/cross-platform/app-fundamentals/building-cross-platform-applications/understanding-the-xamarin-mobile-platform

答案 1 :(得分:0)

这是Xamarin社区和其他社区中的一个众所周知的误解,即Xamarin是Java(Android)和Objective-C(iOS)的包装,但这不是真的。

当您阅读Microsoft文档时,它说,

内幕

  

在iOS上:C#被提前(AOT)编译为ARM汇编语言。包括.NET框架,在链接过程中会删除未使用的类,以减小应用程序的大小。 Apple不允许在iOS上生成运行时代码,因此某些语言功能不可用,因此请参见here

     

在Android上:C#编译为IL,并与MonoVM + JIT打包在一起。链接期间,将删除框架中未使用的类。该应用程序与Java / ART(Android运行时)并排运行,并通过JNI与本机类型进行交互(请参阅Xamarin.Android Limitations)。

Xamarin.iOS LimitationsXamarin.iOS的链接器文档提供了有关编译过程这一部分的更多信息。

应避免运行时“编译”(使用System.Reflection.Emit动态生成代码)。

Apple的内核阻止在iOS设备上动态生成代码,因此,在Xamarin.iOS中无法实时发送代码。同样,动态语言运行时功能不能与Xamarin工具一起使用。

某些反射功能确实起作用(例如MonoTouch.Dialog将其用于Reflection API),而不是代码生成。

如有查询,祝您好运