Xamarin. iOS の制限事項Limitations of Xamarin.iOS

Xamarin を使用するアプリケーションは静的コードにコンパイルされるため、実行時にコード生成を必要とする機能を使用することはできません。Since applications using Xamarin.iOS are compiled to static code, it is not possible to use any facilities that require code generation at runtime.

次に示したのは、デスクトップの Mono と比較した、iOS の制限事項です。These are the Xamarin.iOS limitations compared to desktop Mono:

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

従来の Mono/NET とは異なり、iPhone 上のコードは JIT コンパイラによって要求時にコンパイルされるのではなく、事前に静的にコンパイルされます。Unlike traditional Mono/.NET, code on the iPhone is statically compiled ahead of time instead of being compiled on demand by a JIT compiler.

Mono の完全な AOTテクノロジでは、ジェネリックに関していくつかの制限があります。これは、コンパイル時にすべてのジェネリックインスタンスを事前に決定できるわけではないためです。Mono's Full AOT technology has a few limitations with respect to generics, these are caused because not every possible generic instantiation can be determined up front at compile time. このコードは常に Just-in-time コンパイラを使用して実行時にコンパイルされるので、通常の .NET または Mono ランタイムでは問題になりません。This is not a problem for regular .NET or Mono runtimes as the code is always compiled at runtime using the Just in Time compiler. しかし、これにより、Xamarin. iOS のような静的コンパイラの課題が生じます。But this poses a challenge for a static compiler like Xamarin.iOS.

開発者が実行する一般的な問題には、次のようなものがあります。Some of the common problems that developers run into, include:

NSObjects の汎用サブクラスは制限されていますGeneric Subclasses of NSObjects are limited

現在、Xamarin iOS では、ジェネリックメソッドのサポートがないなど、NSObject クラスの汎用サブクラスを作成するためのサポートが制限されています。Xamarin.iOS currently has limited support for creating generic subclasses of the NSObject class, such as no support for generic methods. 7.2.1 の場合、次のように NSObjects の汎用サブクラスを使用できます。As of 7.2.1, using generic subclasses of NSObjects is possible, like this one:

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

注意

NSObjects の汎用サブクラスは可能ですが、いくつかの制限があります。While generic subclasses of NSObjects are possible, there are a few limitations. 詳細については、 NSObject ドキュメントの汎用サブクラスを参照してください。Read the Generic subclasses of NSObject document for more information

動的なコード生成なしNo Dynamic Code Generation

IOS カーネルでは、アプリケーションがコードを動的に生成できないようにするため、Xamarin は、どのような形式の動的コード生成もサポートしていません。Since the iOS kernel prevents an application from generating code dynamically, Xamarin.iOS does not support any form of dynamic code generation. これには以下が含まれます。These include:

  • システムのリフレクションは使用できません。The System.Reflection.Emit is not available.
  • System.string はサポートされていません。No support for System.Runtime.Remoting.
  • 型を動的に作成することはサポートされていません (タイプ gettype ("MyType ' 1"))。ただし、既存の型 (たとえば、GetType ("System.string") は正常に動作します)。No support for creating types dynamically (no Type.GetType ("MyType`1")), although looking up existing types (Type.GetType ("System.String") for example, works just fine).
  • 逆コールバックは、コンパイル時にランタイムに登録する必要があります。Reverse callbacks must be registered with the runtime at compile time.

System.Reflection.EmitSystem.Reflection.Emit

システムリフレクションの欠如。The lack of System.Reflection. 生成とは、ランタイムコードの生成に依存するコードが動作しないことを意味します。Emit means that no code that depends on runtime code generation will work. これには次のものが含まれます。This includes things like:

  • 動的言語ランタイム。The Dynamic Language Runtime.

  • 動的言語ランタイムの上に構築されたすべての言語。Any languages built on top of the Dynamic Language Runtime.

  • リモート処理の TransparentProxy、またはランタイムがコードを動的に生成するその他のもの。Remoting's TransparentProxy or anything else that would cause the runtime to generate code dynamically.

    重要

    リフレクションを混同ないでください。リフレクションを使用して出力します。Do not confuse Reflection.Emit with Reflection. リフレクションは、コードを動的に生成し、そのコードを Jit してネイティブコードにコンパイルします。Reflection.Emit is about generating code dynamically and have that code JITed and compiled to native code. IOS の制限 (JIT コンパイルなし) のため、これはサポートされていません。Due to the limitations on iOS (no JIT compilation) this is not supported.

しかし、型 GetType ("someClass")、メソッドの一覧表示、プロパティの一覧表示、属性と値の取得などを含むリフレクション API 全体は正常に機能します。But the entire Reflection API, including Type.GetType ("someClass"), listing methods, listing properties, fetching attributes and values works just fine.

デリゲートを使用したネイティブ関数の呼び出しUsing Delegates to call Native Functions

C# デリゲートを使用してネイティブ関数を呼び出すには、デリゲートの宣言を次の属性のいずれかで修飾する必要があります。To call a native function through a C# delegate, the delegate's declaration must be decorated with one of the following attributes:

これらの属性のいずれかを指定しないと、次のような実行時エラーが発生します。Failing to provide one of these attributes will result in a runtime error such as:

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.

逆コールバックReverse Callbacks

標準 Mono では、関数ポインターの代わりに C# デリゲートインスタンスをアンマネージコードに渡すことができます。In standard Mono it is possible to pass C# delegate instances to unmanaged code in lieu of a function pointer. 通常、ランタイムは、これらの関数ポインターを小さなサンクに変換し、アンマネージコードがマネージコードにコールバックできるようにします。The runtime would typically transform those function pointers into a small thunk that allows unmanaged code to call back into managed code.

Mono では、これらのブリッジはジャストインタイムコンパイラによって実装されます。In Mono these bridges are implemented by the Just-in-Time compiler. IPhone が必要とする事前対応のコンパイラを使用する場合は、この時点で2つの重要な制限があります。When using the ahead-of-time compiler required by the iPhone there are two important limitations at this point:

  • MonoPInvokeCallbackAttributeを使用して、すべてのコールバックメソッドにフラグを付ける必要があります。You must flag all of your callback methods with the MonoPInvokeCallbackAttribute
  • メソッドは静的メソッドである必要がありますが、インスタンスメソッドはサポートされていません。The methods have to be static methods, there is no support for instance methods.

リモート処理なしNo Remoting

リモート処理スタックは、Xamarin. iOS では使用できません。The Remoting stack is not available on Xamarin.iOS.

実行時に無効な機能Runtime Disabled Features

Mono の iOS ランタイムでは、次の機能が無効になっています。The following features have been disabled in Mono's iOS Runtime:

  • プロファイラーProfiler
  • リフレクション。生成Reflection.Emit
  • リフレクション. 生成. 保存機能Reflection.Emit.Save functionality
  • COM バインディングCOM bindings
  • JIT エンジンThe JIT engine
  • メタデータ検証機能 (JIT がないため)Metadata verifier (since there is no JIT)

.NET API の制限事項.NET API Limitations

公開されている .NET API は完全なフレームワークのサブセットであり、すべての iOS で利用できるわけではありません。The .NET API exposed is a subset of the full framework as not everything is available in iOS. 現在サポートされているアセンブリの一覧については、FAQ を参照してください。See the FAQ for a list of currently supported assemblies.

具体的には、Xamarin. iOS で使用される API プロファイルには、System. Configuration が含まれていないため、外部 XML ファイルを使用してランタイムの動作を構成することはできません。In particular, the API profile used by Xamarin.iOS does not include System.Configuration, so it is not possible to use external XML files to configure the behavior of the runtime.