Sdílet prostřednictvím


Architektura Xamarin.Mac

Tento průvodce zkoumá Xamarin.Mac a jeho vztah na Objective-C nízké úrovni. Vysvětluje koncepty, jako jsou kompilace, selektory, registrarsspuštění aplikace a generátor.

Přehled

Aplikace Xamarin.Mac běží v prostředí mono spouštění a používají kompilátor Xamarinu ke kompilaci do zprostředkujícího jazyka (IL), který je pak za běhu zkompilován do nativního kódu. Spustí se souběžně s modulem Objective-C Runtime. Obě prostředí modulu runtime běží nad jádrem podobným systém UNIX, konkrétně XNU, a zveřejňují různá rozhraní API pro uživatelský kód, což vývojářům umožňuje přístup k podkladovému nativnímu nebo spravovanému systému.

Následující diagram znázorňuje základní přehled této architektury:

Diagram showing a basic overview of the architecture

Nativní a spravovaný kód

Při vývoji pro Xamarin se často používají termíny nativní a spravovaný kód. Spravovaný kód je kód, který má spuštění spravované modulem .NET Framework Common Language Runtime nebo v případě Xamarinu: Mono Runtime.

Nativní kód je kód, který se bude nativně spouštět na konkrétní platformě (například Objective-C nebo dokonce zkompilovaný kód AOT na čipu ARM). V této příručce se dozvíte, jak je spravovaný kód zkompilován do nativního kódu, a vysvětluje, jak funguje aplikace Xamarin.Mac, která plně využívají rozhraní API pro Mac společnosti Apple prostřednictvím vazeb a zároveň mají přístup k . Net je seznam BCL a sofistikovaný jazyk, jako je C#.

Požadavky

K vývoji aplikace pro macOS pomocí Xamarin.Mac se vyžaduje následující:

  • Mac se systémem macOS Sierra (10.12) nebo novějším.
  • Nejnovější verze Xcode (nainstalovaná z App Storu)
  • Nejnovější verze Xamarin.Mac a Visual Studio pro Mac

Spouštění aplikací pro Mac vytvořených pomocí Xamarin.Mac má následující požadavky na systém:

  • Mac se systémem Mac OS X 10.7 nebo novějším.

Kompilace

Když zkompilujete libovolnou aplikaci platformy Xamarin, spustí se kompilátor Mono C# (nebo F#) a zkompiluje kód jazyka C# a F# do jazyka Microsoft Intermediate Language (MSIL nebo IL). Xamarin.Mac pak pomocí kompilátoru JIT (Just in Time) za běhu kompiluje nativní kód a podle potřeby umožňuje spouštění ve správné architektuře.

To je na rozdíl od Xamarin.iOS, který používá kompilaci AOT. Při použití kompilátoru AOT se všechna sestavení a všechny metody v nich kompilují v době sestavení. S JIT se kompilace provádí na vyžádání pouze pro metody, které se spustí.

S aplikacemi Xamarin.Mac se Mono obvykle vloží do sady aplikací (a označuje se jako Embedded Mono). Při použití klasického rozhraní Xamarin.Mac API může aplikace místo toho použít System Mono, ale v sjednoceném rozhraní API to není podporováno. System Mono odkazuje na Mono, který byl nainstalován v operačním systému. Při spuštění aplikace ji použije aplikace Xamarin.Mac.

Voliče

S Xamarinem máme dva samostatné ekosystémy, .NET a Apple, které musíme spojit dohromady, aby se zdálo co nejfektivněnější, abychom zajistili, že konečným cílem je bezproblémové uživatelské prostředí. V části výše jsme viděli, jak dva moduly runtime komunikují, a možná jste velmi dobře slyšeli o termínu "vazby", což umožňuje použití nativních rozhraní MAC API v Xamarinu. Vazby jsou podrobně vysvětleny v Objective-C dokumentaci k vazbám, takže prozatím se podíváme, jak Xamarin.Mac funguje pod kapotou.

Nejprve musí existovat způsob, jak zpřístupnit Objective-C jazyku C#, který se provádí prostřednictvím selektorů. Selektor je zpráva, která je odeslána do objektu nebo třídy. Díky Objective-C tomu se provádí prostřednictvím funkcí objc_msgSend . Další informace o používání selektorů najdete v průvodci selektory pro iOS.Objective-C Také musí existovat způsob, jak zpřístupnit spravovaný kód Objective-C, což je složitější vzhledem k tomu, že Objective-C neví nic o spravovaném kódu. Abychom to mohli obejít, používáme .registrar To je podrobněji vysvětleno v další části.

Registrar

Jak je uvedeno výše, jedná se o registrar kód, který zveřejňuje spravovaný kód Objective-C. Provede to vytvořením seznamu každé spravované třídy, která je odvozena z NSObject:

  • Pro všechny třídy, které nezalamují existující Objective-C třídu, vytvoří novou Objective-C třídu se Objective-C členy zrcadlící všechny spravované členy, kteří mají [Export] atribut.
  • V implementacích každého člena Objective–C se kód přidá automaticky pro volání zrcadlového spravovaného člena.

Níže uvedený pseudokód ukazuje příklad toho, jak se to dělá:

C# (spravovaný kód):

class MyViewController : UIViewController{
    [Export ("myFunc")]
    public void MyFunc ()
    {
    }
 }

Objective-C (nativní kód):

@interface MyViewController : UIViewController
 - (void)myFunc;
@end

@implementation MyViewController
- (void)myFunc {
    // Code to call the managed C# MyFunc method in MyViewController
}
@end

Spravovaný kód může obsahovat atributy a [Export], že používá vědět, [Register] že registrar objekt musí být vystaven Objective-C. Atribut [Register] slouží k určení názvu vygenerované Objective-C třídy v případě, že výchozí vygenerovaný název není vhodný. Všechny třídy odvozené z NSObject jsou automaticky registrovány v Objective-C. Požadovaný atribut [Export] obsahuje řetězec, což je selektor použitý ve vygenerované Objective-C třídě.

V Xamarin.Mac existují dva typy registrars použití – dynamické a statické:

  • Dynamická registrars – Toto je výchozí nastavení registrar pro všechny buildy Xamarin.Mac. Dynamická registrar provede registraci všech typů v sestavení za běhu. Dělá to pomocí funkcí poskytovaných rozhraním Objective-CAPI modulu runtime. Dynamická funkce registrar má proto pomalejší spouštění, ale rychlejší čas sestavení. Nativní funkce (obvykle v jazyce C), označované jako trampoliny, se používají jako implementace metod při použití dynamické registrars. Liší se mezi různými architekturami.
  • Static registrars – Statický registrar generuje Objective-C kód během sestavení, který se pak zkompiluje do statické knihovny a propojil do spustitelného souboru. To umožňuje rychlejší spuštění, ale během sestavování trvá déle.

Spuštění aplikace

Logika spouštění Xamarin.Mac se bude lišit v závislosti na tom, jestli se používá embedded nebo system Mono. Pokud chcete zobrazit kód a postup spuštění aplikace Xamarin.Mac, přečtěte si soubor hlavičky spuštění ve veřejném úložišti xamarin-macios.

Generátor

Xamarin.Mac obsahuje definice pro každé rozhraní MAC API. Můžete procházet kteroukoli z těchto možností v úložišti MaciOS na GitHubu. Tyto definice obsahují rozhraní s atributy a také všechny nezbytné metody a vlastnosti. Například následující kód slouží k definování NSBox v oboru názvů AppKit. Všimněte si, že se jedná o rozhraní s řadou metod a vlastností:

[BaseType (typeof (NSView))]
public interface NSBox {

    …

    [Export ("borderRect")]
    CGRect BorderRect { get; }

    [Export ("titleRect")]
    CGRect TitleRect { get; }

    [Export ("titleCell")]
    NSObject TitleCell { get; }

    [Export ("sizeToFit")]
    void SizeToFit ();

    [Export ("contentViewMargins")]
    CGSize ContentViewMargins { get; set; }

    [Export ("setFrameFromContentFrame:")]
    void SetFrameFromContentFrame (CGRect contentFrame);

    …

}

Generátor, který je volána bmac v Xamarin.Mac, přebírá tyto definiční soubory a používá nástroje .NET ke kompilaci do dočasného sestavení. Toto dočasné sestavení však nelze použít k volání Objective-C kódu. Generátor pak přečte dočasné sestavení a vygeneruje kód jazyka C#, který lze použít za běhu. To je důvod, proč například když do souboru .cs definice přidáte náhodný atribut, nezobrazí se ve výstupním kódu. Generátor o něm neví, a proto bmac ho neví hledat v dočasném sestavení, aby ho vystavil.

Jakmile se Xamarin.Mac.dll vytvoří, packager mmpseskupí všechny komponenty dohromady.

Na vysoké úrovni toho dosahuje provedením následujících úloh:

  • Vytvořte strukturu sady aplikací.
  • Zkopírujte ve spravovaných sestaveních.
  • Pokud je propojení povolené, spusťte spravovaný linker pro optimalizaci sestavení odebráním nepoužívaných částí.
  • Vytvořte aplikaci spouštěče, která propojí kód spouštěče, o kterém se mluvilo společně s kódem, pokud je ve statickém registrar režimu.

To se pak spustí jako součást procesu sestavení uživatele, který zkompiluje uživatelský kód do sestavení, které odkazuje na Xamarin.Mac.dll, a spustí mmp se, aby se vytvořil balíček.

Podrobnější informace o linkeru a jeho použití najdete v průvodci linkerem pro iOS.

Shrnutí

Tato příručka se podívala na kompilaci aplikací Xamarin.Mac a prozkoumala Xamarin.Mac a její vztah k Objective-C.