我有一个Forms应用程序,我对它如何在我理解使用Swift的iOS和我认为是Java的Android上运行感到困惑。
谁能解释C#代码发生了什么以及如何在这两个平台上运行共享代码?
答案 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 Limitations和Xamarin.iOS的链接器文档提供了有关编译过程这一部分的更多信息。
应避免运行时“编译”(使用System.Reflection.Emit动态生成代码)。
Apple的内核阻止在iOS设备上动态生成代码,因此,在Xamarin.iOS中无法实时发送代码。同样,动态语言运行时功能不能与Xamarin工具一起使用。
某些反射功能确实起作用(例如MonoTouch.Dialog将其用于Reflection API),而不是代码生成。
如有查询,祝您好运