Bagikan melalui


Batasan Xamarin.iOS

Karena aplikasi yang menggunakan Xamarin.iOS dikompilasi ke kode statis, tidak mungkin untuk menggunakan fasilitas apa pun yang memerlukan pembuatan kode pada runtime.

Ini adalah batasan Xamarin.iOS dibandingkan dengan Mono desktop:

Dukungan Generik Terbatas

Tidak seperti Mono/.NET tradisional, kode pada i Telepon dikompilasi secara statis sebelumnya alih-alih dikompilasi sesuai permintaan oleh kompilator JIT.

Teknologi AOT Penuh Mono memiliki beberapa batasan sehubungan dengan generik, ini disebabkan karena tidak setiap kemungkinan instansiasi generik dapat ditentukan di muka pada waktu kompilasi. Ini bukan masalah untuk runtime .NET atau Mono reguler karena kode selalu dikompilasi saat runtime menggunakan kompilator Just in Time. Tetapi ini menimbulkan tantangan untuk pengkompilasi statis seperti Xamarin.iOS.

Beberapa masalah umum yang dialamakan pengembang, meliputi:

Subkelas Generik NSObjects terbatas

Xamarin.iOS saat ini memiliki dukungan terbatas untuk membuat subkelas generik kelas NSObject, seperti tidak ada dukungan untuk metode generik. Pada 7.2.1, menggunakan subkelas generik NSObjects dimungkinkan, seperti ini:

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

Catatan

Meskipun subkelas generik NSObjects dimungkinkan, ada beberapa batasan. Baca subkelas generik dokumen NSObject untuk informasi selengkapnya

Tidak Ada Pembuatan Kode Dinamis

Karena kernel iOS mencegah aplikasi menghasilkan kode secara dinamis, Xamarin.iOS tidak mendukung bentuk pembuatan kode dinamis apa pun. Ini termasuk:

  • System.Reflection.Emit tidak tersedia.
  • Tidak ada dukungan untuk System.Runtime.Remoting.
  • Tidak ada dukungan untuk membuat jenis secara dinamis (tidak ada Type.GetType ("MyType'1")), meskipun mencari jenis yang ada (Type.GetType ("System.String") misalnya, berfungsi dengan baik).
  • Panggilan balik harus didaftarkan dengan runtime pada waktu kompilasi.

System.Reflection.Emit

Kurangnya System.Reflection. Memancarkan berarti bahwa tidak ada kode yang bergantung pada pembuatan kode runtime akan berfungsi. Ini termasuk hal-hal seperti:

  • Runtime Bahasa Dinamis.

  • Bahasa apa pun yang dibangun di atas Dynamic Language Runtime.

  • TransparentProxy remoting atau hal lain yang akan menyebabkan runtime menghasilkan kode secara dinamis.

    Penting

    Jangan bingung Reflection.Emit dengan Reflection. Reflection.Emit adalah tentang menghasilkan kode secara dinamis dan memiliki kode tersebut JITed dan dikompilasi ke kode asli. Karena keterbatasan pada iOS (tidak ada kompilasi JIT) ini tidak didukung.

Tetapi seluruh API Refleksi, termasuk Type.GetType ("someClass"), metode daftar, properti daftar, mengambil atribut dan nilai berfungsi dengan baik.

Menggunakan Delegasi untuk memanggil Fungsi Asli

Untuk memanggil fungsi asli melalui delegasi C#, deklarasi delegasi harus dihiasi dengan salah satu atribut berikut:

Gagal menyediakan salah satu atribut ini akan mengakibatkan kesalahan runtime seperti:

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.

Panggilan Balik

Dalam Mono standar dimungkinkan untuk meneruskan instans delegasi C# ke kode yang tidak dikelola sebagai pengganti penunjuk fungsi. Runtime biasanya akan mengubah penunjuk fungsi tersebut menjadi thunk kecil yang memungkinkan kode yang tidak dikelola untuk memanggil kembali ke kode terkelola.

Di Mono jembatan ini diimplementasikan oleh kompilator Just-in-Time. Saat menggunakan kompilator sebelumnya yang diperlukan oleh i Telepon ada dua batasan penting pada saat ini:

  • Anda harus menandai semua metode panggilan balik Anda dengan MonoPInvokeCallbackAttribute
  • Metode harus metode statis, tidak ada dukungan untuk metode instans.

Tidak Remoting

Tumpukan Jarak Jauh tidak tersedia di Xamarin.iOS.

Fitur Runtime Dinonaktifkan

Fitur berikut telah dinonaktifkan di Mono's iOS Runtime:

  • Profiler
  • Pantulan.Pancaran
  • Fungsionalitas Reflection.Emit.Save
  • Pengikatan COM
  • Mesin JIT
  • Pemverifikasi metadata (karena tidak ada JIT)

Batasan API .NET

.NET API yang diekspos adalah subset dari kerangka kerja lengkap karena tidak semuanya tersedia di iOS. Lihat FAQ untuk daftar rakitan yang saat ini didukung.

Secara khusus, profil API yang digunakan oleh Xamarin.iOS tidak menyertakan System.Configuration, sehingga tidak dimungkinkan untuk menggunakan file XML eksternal untuk mengonfigurasi perilaku runtime.