Xamarin.iOS(MonoTouch)とXamarin.Android(Mono for Android)の仕組みを理解しようとしています。私は小さなアプリを書いて、.appと.apkファイルを調べました。
.appファイル(iOS)の内部には、多くの.dllファイルがあります。しかし、なぜ?私は読んだすべてのページと投稿で、彼らは言う:アプリはネイティブで実行され、何も解釈されません。 xamarin開発者が「ネイティブ」で何を意味するのか誰かに説明できますか?
.apkファイルの内部は、単一の.dllファイルではありません。
Xamarinの「ネイティブ」の定義には、次のものが含まれますが、これらに限定されません。
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のコメントは、いくつかの内部実装の詳細を示しています。
まず、Xamarinは2つの異なるランタイムで同時に動作します。
いくつかの例。 Visual Studioで独自のC#クラスを作成する場合、このクラスのインスタンスはMonoで実行されます。また、nugetからNewton.Jsonパッケージをダウンロードしている場合、これはMonoでも実行されます。これが、.NETの優れた機能をすべて使用できる理由です。ただし、Java.Lang.Object(Android)またはNSObject(iOS)から継承する場合、またはカスタムコントロールを作成する場合、これらのクラスのインスタンスはネイティブランタイムで実行されます。
次に、これら2つの世界を何らかの形でバインドする必要があることに気づくでしょう。どんなタイプのオブジェクトがあるのか見てみましょう。
ピアオブジェクトは、Xamarin SDKクラスのインスタンス(たとえば、アクティビティ、ビューコントロール、UILabels、TextViewsなど)、Java.Lang.Object、NSObject、Fragment、またはUISegmentクラスから継承する独自のインスタンスです。
そのメカニズムは、Xamarinの最も重要なものの1つです。
PS:実際には、XamarinプロジェクトのJITとAOTのどちらを使用するかは問題ではありません。これはプラットフォームに依存し、.NETの世界の一部の機能を許可または許可しません。 Xamarinがどのように機能するかは説明していません。
Xamarinコンパイラは.NETランタイムをバンドルし、ネイティブ(バイナリ)ARM実行可能ファイルを出力し、iOSまたはAndroidアプリとしてパッケージ化されています。