Xamarin は、2011年に発表されたC#でモバイルアプリケーションを作成するためのMicrosoftのプラットフォームです。Microsoft Xamarin Documentation, 2024 によると、Xamarin は C# と .NET の共有コードベースを使用して iOS、Android、Windows 向けのアプリケーションを作成でき、Mono Runtime を使用してネイティブコードにコンパイルします。2024年以降、Xamarin.Forms は .NET MAUI に置き換えられました。
重要ポイント
Xamarin は、.NET と Mono に基づくプラットフォームであり、クロスプラットフォームのモバイルアプリケーションを作成するために C# を使用できます。Xamarin 社は 2011 年に設立され、2016 年に Microsoft が 4 億ドルで買収しました。買収後、Xamarin は Visual Studio および Azure エコシステムの一部になりました。
買収前、Xamarin は Enterprise ライセンスの商用製品でした。Microsoft は Visual Studio Community の一部として無料化し、Mono Runtime と SDK バインディングのソースコードもオープンソース化しました。これにより人気が高まり、SlashData のレポートによると、2020 年までに Xamarin はクロスプラットフォームプロジェクトの 15% で使用されていました。
Xamarin の主なアイデアは、コードを 3 つの層に分割することです: 共有ビジネスロジック (C#、.NET Standard)、プラットフォーム固有のプロジェクト (iOS、Android)、および Xamarin.Forms を介したオプションの共有 UI。このアプローチにより、各プラットフォームの API へのネイティブアクセスを維持しながら、最大 75% のコードを再利用できました。
最初のバージョン Xamarin 1.0 は 2012 年に iOS のみのサポートでリリースされました。Android サポートは 2013 年に追加されました。宣言型 UI フレームワークである Xamarin.Forms は 2014 年の Evolve カンファレンスで発表されました。Xamarin 4.0 (2016) には watchOS と tvOS のサポートが含まれていました。Xamarin 5.0 (2019) では CSS スタイルと Material Design テーマが導入されました。
最新のメジャーバージョン Xamarin.Forms 5.0 は 2021 年にリリースされました。Microsoft は Xamarin がサポートモードに入ることを発表し (サポート終了: 2024 年 5 月 1 日)、.NET 6+ の一部である .NET MAUI (Multi-platform App UI) への移行を推奨しました。Xamarin.Forms 5.0 は新機能を受け取らず、重要なセキュリティ修正のみを受け取ります。
Xamarin.Forms は、統一されたコンポーネントセットを通じてインターフェースを抽象化する UI フレームワークです。XAML マークアップ (ContentPage、StackLayout、Label、Button) は、レンダラーを介して各プラットフォームのネイティブコントロールにマッピングされます。Label は iOS では UILabel、Android では TextView に変換されます。このアプローチにより、最大 95% の共有 UI コードが実現します。
Xamarin.Native (Xamarin.iOS および Xamarin.Android とも呼ばれる) は、共有 UI なしのアプローチです。開発者は単一の C# バックエンドを使用して、iOS (Interface Builder または Storyboard) と Android (AXML) 用に個別の画面を作成します。これにより各プラットフォームの外観を完全に制御できますが、UI コードの重複が 50~60% に増加します。
Microsoft Developer Survey 2023 によると、Xamarin プロジェクトの 70% が Xamarin.Forms、20% が共有サービスを持つ Xamarin.Native、10% がプラットフォーム固有の最適化のためのカスタムレンダラーを使用したハイブリッドアプローチでした。
Xamarin のアーキテクチャ は 2 つのレベルで構成されています。下位レベルは Mono Runtime で、プラットフォーム上で C# IL (Intermediate Language) を実行します。上位レベルは、iOS 用の Managed Callable Wrappers (MCW) と Android 用の Android Bindings で構成され、マネージド C# コードからネイティブ API へのアクセスを提供します。
Mono は .NET Framework のオープンソース実装です。Xamarin では、Mono は Common Language Runtime (CLR) として動作し、C# アセンブリをロードしてマシンコードにコンパイルします。iOS では、Mono は事前コンパイル (AOT) で ARM64 マシンコードにコンパイルします。Apple はユーザーアプリケーションでの JIT コンパイルを禁止しているためです。Android では、Mono は AOT プロファイリングを使用した JIT コンパイルを使用します。
iOS バインディング (Xamarin.iOS) は、Objective-C ランタイム上の C# ラッパーです。各 UIKit クラス (UIView、UIViewController) は、Xamarin.iOS.dll アセンブリ内のマネージドクラスで表現されます。Objective-C セレクターは MessageUI メカニズムを介して呼び出されます。Android では、Xamarin.Android は Android Callable Wrappers (ACW) — C# と Java/Kotlin の間の JNI ブリッジを使用します。Kotlin ライブラリは Android Bindings Library を介してラップされます。
XAML (eXtensible Application Markup Language) は UI を記述するための宣言型言語です。Xamarin.Forms では、XAML が画面構造を定義します: ページ (ContentPage)、コンテナ (StackLayout、Grid、FlexLayout)、要素 (Label、Entry、Button、ListView)。C# のコードビハインドはイベント (Clicked、PropertyChanged) を処理し、データバインディング (Binding、Data Binding) を管理します。
MVVM パターン は Xamarin.Forms で推奨されるアーキテクチャです。Model はデータを保持し、ViewModel は INotifyPropertyChanged とコマンド (ICommand) を実装し、View (XAML) は BindingContext を介してバインドします。RelayCommand や Prism DelegateCommand を介した ICommand の実装により、UI 依存関係なしで ViewModel をテストできます。Prism.Forms ライブラリは NavigationService、DialogService、およびモジュール性を提供します。
using Xamarin.Forms;
namespace XamarinApp
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
var label = new Label
{
Text = "Hello, Xamarin!",
FontSize = 24,
VerticalOptions = LayoutOptions.Center,
HorizontalOptions = LayoutOptions.Center
};
Content = new StackLayout
{
Children = { label }
};
}
}
}
統一された C# 言語 — Xamarin の主な利点です。C# と .NET の開発者は、Swift、Kotlin、Objective-C を学ばずにモバイルアプリケーションを作成できます。ビジネスロジック、ネットワーキング、データベース (ORM 経由の SQLite)、暗号化、ロギングは一度記述すればすべてのプラットフォームで再利用できます。これによりコードの保守とテストが簡素化されます。
ネイティブ API へのアクセス — Xamarin はバインディングを介して iOS (Cocoa Touch) および Android (Android SDK) API への 100% のアクセスを提供します。iOS または Android の新しいバージョンがリリースされると、Microsoft は 24~48 時間以内に更新されたバインディングを公開します。不足しているバインディング (カスタム Objective-C または Kotlin ライブラリ) については、Android Bindings Library または iOS Binding Library を手動で作成します。
Microsoft エコシステムとの統合 — Xamarin は Visual Studio、Azure DevOps、App Center (CI/CD、テスト、監視)、Enterprise Mobility + Security (Intune、ADAL、MSAL) をサポートしています。App Center Analytics と Crashes はライブアプリケーションからデータを収集します。Visual Studio App Center はビルド、デバイステスト、アプリストアへの公開を自動化します。
欠点 として、アプリケーションサイズが挙げられます — 空の画面の Xamarin.Forms APK は 25~35 MB であるのに対し、ネイティブ Android アプリは 5~8 MB です。コンパイル時間も長く、中規模プロジェクトは 2~5 分かかるのに対し、ネイティブ Android Studio では 30~60 秒です。Mono Runtime は最終バイナリに 15~20 MB 追加します。
2 つ目の欠点は 新しい API の遅延 です。新しい iOS/Android 機能はネイティブ開発ではすぐに利用できますが、Xamarin ではバインディングリリースから 1~2 ヶ月後に到着します。iOS 17 SDK (2023) はリリースから 3 週間後に Xamarin で完全サポートされました。緊急のプロジェクトでは、これが重要になる可能性があります。.NET MAUI は .NET 8 との直接統合によりこの問題を解決します。
| 基準 | Xamarin | .NET MAUI |
|---|---|---|
| プラットフォーム | iOS、Android、Windows | iOS、Android、Windows、macOS、Tizen |
| 基本フレームワーク | Mono + .NET Standard | .NET 6+ (統合 BCL) |
| UI フレームワーク | Xamarin.Forms | .NET MAUI (後継) |
| サポート状況 | 2024年5月1日でサポート終了 | Microsoft が活発に開発中 |
| Hot Reload | 制限あり | XAML Hot Reload + C# Reload |
.NET MAUI (Multi-platform App UI) は Xamarin.Forms の進化版で、Microsoft が 2022 年に .NET 6 とともにリリースしました。MAUI は iOS、Android、Windows、macOS を単一のプロジェクトに統合し、プラットフォームごとに個別のプロジェクトは必要ありません。Xamarin.Forms とは異なり、MAUI は Mono と .NET Standard ではなく .NET 6+ BCL を使用します。
Microsoft は 移行ツール — Visual Studio 用の .NET Upgrade Assistant を提供しています。これは Xamarin.Forms プロジェクトを分析し、名前空間を置き換え (Xamarin.Forms.* -> Microsoft.Maui.*)、.csproj ファイルを更新し (SDK スタイル形式)、Android と iOS の設定を統一構成に移行します。移行後、プロジェクトは .NET 8 のすべての新機能 (Native AOT、セキュリティ用の CodeQL、ビルドパフォーマンスの向上) を活用できます。
重要な変更は 単一プロジェクト です。Xamarin.Forms では 3 つの個別プロジェクト (iOS、Android、.NET Standard) が必要でしたが、.NET MAUI は Platforms/iOS、Platforms/Android、Platforms/Windows、Platforms/MacCatalyst フォルダを持つ 1 つのプロジェクトを使用します。各プラットフォームは、プラットフォーム固有の条件付きディレクティブ (#if ANDROID、#if IOS) を使用して共有コードからコンパイルされます。
既存のコードベース の場合、.NET MAUI は Xamarin.Forms との 90% の後方互換性を維持しています。API 互換性は ContentView、ContentPage、Shell、NavigationPage、DependencyService、MessagingCenter をカバーしています。主な変更は Device.StartTimer (IDispatcher に置き換え)、Platform API (Microsoft.Maui.ApplicationModel に移動)、非推奨のレンダラー (Handlers に置き換え) に影響しました。
移行 プロセスは 5 つのステップで構成されます。第一に — Xamarin.Forms を最新バージョン 5.0 に更新します。第二に — .NET Standard 2.0 を .NET 6 または 8 に置き換えます。第三に — Upgrade Assistant を実行してプロジェクトを自動変換します。第四に — Platforms フォルダ内のプラットフォーム固有コードを修正します。第五に — 特にカスタムレンダラーとプラットフォームサービスのテストを行います。
よくある質問
Xamarin は、iOS、Android、Windows 向けの C# 開発のための Microsoft モバイルプラットフォームです。共有コードコンパイルに Mono Runtime を使用し、Xamarin.Forms (XAML による統一 UI) と Xamarin.Native (プラットフォームネイティブ画面) の 2 つのアプローチを提供します。2024 年以降、Xamarin はサポートモードです。
Xamarin は C# と .NET を使用し、バインディングを介してネイティブコントロール (UIKit、View) を通じてレンダリングします。Flutter は Dart と独自のレンダリングエンジン (Impeller) を使用し、ネイティブ UI コンポーネントに依存しません。Flutter はすべてのプラットフォームで一貫した外観を提供し、Xamarin は各 OS のネイティブな外観を提供します。Flutter は Google がサポートし、Xamarin の 15% に対して 46% のシェアを持っています。
いいえ。Microsoft は 2024 年 5 月 1 日に Xamarin の サポートを終了 しました。すべての新規プロジェクトは、.NET 8 に組み込まれ、.NET プラットフォームとともに更新を受ける後継の .NET MAUI で開始する必要があります。既存の Xamarin.Forms プロジェクトについては、12~18 ヶ月以内の移行が推奨されます。
通常のアプリケーションではその差は わずか です。Xamarin.Forms は Managed-Wrapper-Native 層によるレンダリングオーバーヘッドが 5~10% 追加されます。大量のリスト (ListView 対 RecyclerView) やアニメーション (プラットフォーム API なしの Xamarin.Forms 使用) で問題が発生します。CollectionView (ListView を置き換え) とネイティブアニメーションの使用が推奨されます。
はい、Android Bindings Library を通じて可能です。この .NET プロジェクトタイプは、AAR または JAR アーカイブを自動クラスおよびメソッド生成付きの C# バインディングにラップします。Kotlin ライブラリには、コルーチンとシールドクラス用の追加ハンドラが必要で、Binding Library の Metadata.xml を介して設定されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。