Udostępnij za pośrednictwem


Ograniczenia platformy Xamarin.iOS

Ponieważ aplikacje korzystające z platformy Xamarin.iOS są kompilowane do kodu statycznego, nie można używać żadnych obiektów wymagających generowania kodu w czasie wykonywania.

Są to ograniczenia platformy Xamarin.iOS w porównaniu z wersją Desktop Mono:

Ograniczona obsługa typów ogólnych

W przeciwieństwie do tradycyjnego środowiska Mono/.NET kod na platformie i Telefon jest statycznie kompilowany przed upływem czasu, a nie kompilowany na żądanie przez kompilator JIT.

Technologia Full AOT mono ma kilka ograniczeń w odniesieniu do typów ogólnych, ponieważ nie wszystkie możliwe wystąpienia ogólne można określić z góry w czasie kompilacji. Nie jest to problem w przypadku zwykłych środowisk uruchomieniowych .NET lub Mono, ponieważ kod jest zawsze kompilowany w czasie wykonywania przy użyciu kompilatora Just in Time. Jednak stanowi to wyzwanie dla statycznego kompilatora, takiego jak Xamarin.iOS.

Niektóre typowe problemy, z którymi mogą się liczyć deweloperzy, to m.in.:

Ogólne podklasy obiektów NSObject są ograniczone

Platforma Xamarin.iOS ma obecnie ograniczoną obsługę tworzenia ogólnych podklas klasy NSObject, takich jak brak obsługi metod ogólnych. Od wersji 7.2.1 możliwe jest użycie ogólnych podklas NSObjects, takich jak ta:

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

Uwaga

Chociaż możliwe są ogólne podklasy NSObjects, istnieje kilka ograniczeń. Przeczytaj ogólne podklasy dokumentu NSObject, aby uzyskać więcej informacji

Brak dynamicznego generowania kodu

Ponieważ jądro systemu iOS zapobiega dynamicznemu generowaniu kodu przez aplikację, platforma Xamarin.iOS nie obsługuje żadnej formy dynamicznego generowania kodu. Są to:

  • The System. Emocje ion. Emit jest niedostępny.
  • Brak obsługi komunikacji zdalnie system.runtime.remoting.
  • Brak obsługi dynamicznego tworzenia typów (bez type.GetType ("MyType'1")), chociaż wyszukiwanie istniejących typów (Type.GetType ("System.String"), na przykład działa dobrze.
  • Wywołania zwrotne odwrotne muszą być zarejestrowane w środowisku uruchomieniowym w czasie kompilacji.

System. Emocje ion. Emitować

Brak systemu. Emocje ion. Emit oznacza, że nie będzie działać żaden kod zależny od generowania kodu środowiska uruchomieniowego. Mogą być to czynności, takie jak:

  • Środowisko uruchomieniowe języka dynamicznego.

  • Wszystkie języki oparte na środowisku uruchomieniowym języka dynamicznego.

  • Komunikacja zdalna TransparentProxy lub cokolwiek innego, co spowodowałoby dynamiczne generowanie kodu przez środowisko uruchomieniowe.

    Ważne

    Nie należy mylić Emocje ion. Emituj z Emocje ion. Emocje ion. Emit polega na dynamicznym generowaniu kodu i kodzie JITed i kompilowaniu go do kodu natywnego. Ze względu na ograniczenia dotyczące systemu iOS (bez kompilacji JIT) nie jest to obsługiwane.

Jednak cały interfejs API Emocje ion, w tym Type.GetType ("someClass"), metody wyświetlania listy, wyświetlanie listy właściwości, pobieranie atrybutów i wartości działa prawidłowo.

Wywoływanie funkcji natywnych przy użyciu delegatów

Aby wywołać funkcję natywną za pośrednictwem delegata języka C#, deklaracja delegata musi zostać ozdobiona jednym z następujących atrybutów:

Nie można podać jednego z tych atrybutów spowoduje błąd środowiska uruchomieniowego, taki jak:

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.

Zwrotne wywołania zwrotne

W standardzie Mono można przekazać wystąpienia delegatów języka C# do niezarządzanego kodu zamiast wskaźnika funkcji. Środowisko uruchomieniowe zwykle przekształca te wskaźniki funkcji w mały thunk, który umożliwia niezarządzane wywołanie kodu z powrotem do kodu zarządzanego.

W rozwiązaniu Mono te mostki są implementowane przez kompilator Just in Time. W przypadku korzystania z kompilatora przed upływem czasu wymaganego przez program i Telefon w tym momencie istnieją dwa ważne ograniczenia:

  • Wszystkie metody wywołania zwrotnego należy oznaczyć za pomocą atrybutu MonoPInvokeCallbackAttribute
  • Metody muszą być metodami statycznym, nie ma obsługi metod wystąpień.

Brak komunikacji zdalnie

Stos komunikacji zdalnie nie jest dostępny w środowisku Xamarin.iOS.

Funkcje wyłączone w czasie wykonywania

Następujące funkcje zostały wyłączone w środowisku uruchomieniowym systemu iOS mono:

  • Profiler
  • Emocje ion. Emitować
  • Emocje ion. Funkcja Emit.Save
  • Powiązania MODELU COM
  • Aparat JIT
  • Weryfikator metadanych (ponieważ nie ma trybu JIT)

Ograniczenia interfejsu API platformy .NET

Uwidoczniony interfejs API platformy .NET jest podzbiorem pełnej struktury, ponieważ nie wszystko jest dostępne w systemie iOS. Zapoznaj się z często zadawanymi pytaniami, aby uzyskać listę aktualnie obsługiwanych zestawów.

W szczególności profil interfejsu API używany przez platformę Xamarin.iOS nie zawiera pliku System.Configuration, więc nie można używać zewnętrznych plików XML do konfigurowania zachowania środowiska uruchomieniowego.