Xamarin.iOS の制限事項

Xamarin.iOS を使用するアプリケーションは静的コードにコンパイルされ、実行時にコード生成を必要とする機能を使用することはできません。

デスクトップ Mono と比較した Xamarin.iOS の制限事項を次に示します。

制限付きジェネリックのサポート

従来の Mono/.NET とは異なり、iPhone のコードは、JIT コンパイラによってオンデマンドでコンパイルされるのではなく、前もって静的にコンパイルされます。

Mono の 完全な AOT テクノロジには、ジェネリックに関していくつかの制限があります。これは、コンパイル時に可能なすべての汎用インスタンス化を前もって決定できないので発生します。 コードは常に Just In Time コンパイラを使用して実行時にコンパイルされるので、これは通常の .NET または Mono ランタイムでは問題ではありません。 ただし、これは Xamarin.iOS のような静的コンパイラにとって課題になります。

開発者が発生する一般的な問題には、次のようなものがあります。

NSObject のジェネリック サブクラスは制限されています

現在、Xamarin.iOS では、ジェネリック メソッドのサポートがないなど、NSObject クラスのジェネリック サブクラスを作成するためのサポートが制限されています。 7.2.1 の時点では、次のように NSObject のジェネリック サブクラスを使用できます。

class Foo<T> : UIView {
    [..]
}

Note

NSObject のジェネリック サブクラスは可能ですが、いくつかの制限があります。 詳細については 、NSObject のジェネリック サブクラスに関するドキュメント を参照してください。

動的コード生成なし

iOS カーネルではアプリケーションがコードを動的に生成できないので、Xamarin.iOS では動的なコード生成の形式はサポートされていません。 次の設定があります。

  • System.Reflection.Emit は使用できません。
  • System.Runtime.Remoting はサポートされていません。
  • 型を動的に作成する (Type.GetType ("MyType'1")) はサポートされていませんが、既存の型 (Type.GetType ("System.String") など) を検索すると問題ありません。
  • 逆引きコールバックは、コンパイル時にランタイムに登録する必要があります。

System.Reflection.Emit

System.Reflection がない。 出力 は、実行時のコード生成に依存するコードが機能しないという意味です。 これには次のものが含まれます。

  • 動的言語ランタイム。

  • 動的言語ランタイムの上に構築された任意の言語。

  • リモート処理の TransparentProxy など、ランタイムがコードを動的に生成する原因となるもの。

    重要

    Reflection.Emit とリフレクション を混しない。 Reflection.Emit はコードを動的に生成し、そのコードを JITed してネイティブ コードにコンパイルします。 iOS (JIT コンパイルなし) の制限により、これはサポートされていません。

ただし、Type.GetType ("someClass")、メソッドの一覧の表示、プロパティの一覧の取得、属性と値のフェッチなど、リフレクション API 全体は問題ありません。

デリゲートを使用したネイティブ関数の呼び出し

C# デリゲートを使用してネイティブ関数を呼び出す場合、デリゲートの宣言を次のいずれかの属性で装飾する必要があります。

これらの属性のいずれかを指定しない場合、次のようなランタイム エラーが発生します。

System.ExecutionEngineException: Attempting to JIT compile method '(wrapper managed-to-native) YourClass/YourDelegate:wrapper_aot_native(object,intptr,intptr)' while running in aot-only mode.

コールバックの反転

標準の Mono では、関数ポインターの代用として、C# デリゲート インスタンスをアンマネージ コードに渡す可能性があります。 ランタイムは通常、これらの関数ポインターを小さなサンクに変換し、アンマネージ コードがマネージド コードに呼び出しを戻すのを可能にします。

Mono では、これらのブリッジは Just-In-Time コンパイラによって実装されます。 アプリケーションで必要な先行コンパイラを使用する場合iPhone、この時点で次の 2 つの重要な制限があります。

リモート処理なし

リモート処理スタックは Xamarin.iOS では使用できません。

ランタイムが無効になっている機能

Mono の iOS ランタイムでは、次の機能が無効になっています。

  • プロファイラー
  • Reflection.Emit
  • Reflection.Emit.Save 機能
  • COM バインド
  • JIT エンジン
  • メタデータ検証ツール (JIT がない場合)

.NET API の制限事項

公開されている .NET API は完全なフレームワークのサブセットです。iOS ですべてが利用できるとは限らなさっています。 現在サポートされているアセンブリの 一覧については、FAQ を参照してください

特に、Xamarin.iOS で使用される API プロファイルには System.Configuration が含まれるので、外部 XML ファイルを使用してランタイムの動作を構成することはできません。