.NET for Android/iOS應用的如何在各自的系統執行

长空nice發表於2024-12-09

1. .NET for Android 上的執行機制

Android 應用使用 Mono 執行時.NET 執行時 在 Android 裝置上執行。具體過程如下:

編譯過程:

  • C# 程式碼編寫:開發者使用 C# 編寫業務邏輯程式碼。
  • 編譯為 IL:C# 程式碼透過 Roslyn 編譯器 轉換為 中間語言(IL)
  • JIT 或 AOT 編譯
    • JIT(即時編譯):在 Android 上,Mono 執行時 會將 IL 編譯為裝置上能夠執行的機器碼(JIT 編譯)。JIT 編譯在應用執行時動態進行。
    • AOT(提前編譯):從 .NET 6 開始,可以使用 AOT 編譯,在應用釋出時就將 IL 程式碼提前編譯為目標裝置的原生機器碼。

執行時環境:

  • Mono Runtime(對於較舊版本)或 .NET 執行時(從 .NET 6 開始)負責載入和管理這些 IL 程式碼,並處理記憶體、垃圾回收、執行緒管理等任務。

訪問原生 API:

  • 呼叫原生功能:透過 Xamarin.Android.NET for Android 提供的繫結,C# 程式碼可以呼叫 Android 的原生 API。例如,訪問感測器、攝像頭、位置等裝置功能。
  • 平臺特定的程式碼:開發者可以使用 DependencyServiceEffects 等方式,編寫 Android 特有的實現程式碼。

UI 渲染:

  • Xamarin.Forms.NET MAUI 提供了跨平臺 UI 構建工具,使用 渲染器(Renderer)將統一的 UI 控制元件渲染為 Android 原生控制元件(如 Button, Label 等)。UI 渲染會與 Android 原生檢視系統(如 View, Activity)互動。

2. .NET for iOS 上的執行機制

iOS 應用通常透過 Mono 執行時.NET 執行時 進行編譯和執行。與 Android 不同,iOS 對動態編譯有嚴格的限制,因此必須使用 AOT 編譯

編譯過程:

  • C# 程式碼編寫:開發者使用 C# 編寫應用程式的業務邏輯。
  • 編譯為 IL:和 Android 一樣,程式碼首先會被編譯為 中間語言(IL)
  • AOT 編譯
    • 由於 iOS 不允許應用在執行時進行 JIT 編譯,因此必須使用 AOT 編譯(即提前編譯)。這意味著所有的 C# 程式碼都需要在構建時被轉換為 iOS 裝置可以直接執行的原生機器碼。
    • 構建過程中,IL 會被轉換成目標平臺的 ARM 程式碼,並嵌入到最終的 .app 包中。

執行時環境:

  • Mono Runtime.NET Runtime:執行時負責管理記憶體、執行緒、垃圾回收等。由於 iOS 的要求,Mono 執行時需要與 iOS 的平臺規範相容,以確保應用在 iOS 上的效能和穩定性。
  • 應用啟動:應用啟動時,iOS 會載入包含在 .app 包中的原生機器碼並執行。

訪問原生 API:

  • 呼叫原生功能:C# 程式碼透過 Xamarin.iOS 或 .NET for iOS 提供的繫結訪問 iOS 原生 API。例如,訪問裝置的攝像頭、定位功能等。
  • 平臺特定程式碼:同樣可以使用 DependencyService 來實現平臺特定的功能,比如特定於 iOS 的 UI 行為。

UI 渲染:

  • Xamarin.Forms.NET MAUI:使用 渲染器 將跨平臺的 UI 控制元件轉換為 iOS 的原生控制元件。這樣,開發者可以使用統一的 UI 定義來構建 Android 和 iOS 應用,但在底層會呼叫原生的檢視和控制元件進行渲染。

總結:在 Android 和 iOS 上的執行機制比較

機制 Android (透過 .NET for Android) iOS (透過 .NET for iOS)
編譯方式 JIT 編譯(Mono 執行時),也支援 AOT 編譯 AOT 編譯(無法使用 JIT 編譯)
執行時 Mono.NET 執行時 Mono.NET 執行時
API 訪問 呼叫 Android 的原生 API 呼叫 iOS 的原生 API
UI 渲染 渲染器將 UI 控制元件轉換為 Android 原生控制元件 渲染器將 UI 控制元件轉換為 iOS 原生控制元件
平臺特定程式碼 透過 DependencyService 實現平臺特定功能 透過 DependencyService 實現平臺特定功能
應用部署 打包成 APK 檔案,透過 Google Play 釋出 打包成 .ipa 檔案,透過 App Store 釋出

應用如何在 Android 和 iOS 上執行的總結

  1. 編譯為 IL:C# 程式碼首先編譯為中間語言(IL)。
  2. 編譯為原生程式碼
    • Android 上,使用 JIT 編譯AOT 編譯 將 IL 轉換為原生程式碼。
    • iOS 上,必須使用 AOT 編譯,將 IL 轉換為原生 ARM 機器碼。
  3. 執行時:Mono 或 .NET 執行時在裝置上執行編譯後的程式碼,管理記憶體和垃圾回收。
  4. 原生 API 訪問:透過平臺繫結,C# 程式碼可以訪問 Android 或 iOS 的原生 API。
  5. UI 渲染:跨平臺 UI 控制元件透過渲染器轉換為目標平臺的原生控制元件。

這種方式使得 .NET for Android/iOS 應用能夠在 Android 和 iOS 上執行,並且支援對原生功能和 UI 的訪問。透過這些技術,開發者可以用 C# 開發跨平臺應用,同時充分利用平臺特性。

相關文章