Architektura Xamarin.Mac

Tato příručka zkoumá Xamarin.Mac a její vztah k Objective-C na nízké úrovni. Vysvětluje koncepty, jako je kompilace, selektory, , spuštění aplikace a registrars generátor.

Přehled

Aplikace Xamarin.Mac běží v prostředí pro spouštění Mono a používají kompilátor Xamarinu ke kompilaci do intermediate language (IL), který se pak za běhu kompiluje do nativního kódu za běhu. Spustí se vedle modulu Objective-C runtime. Obě prostředí runtime běží nad jádrem typu systém UNIX, konkrétně XNU, a zpřístupňuje různá rozhraní API uživatelskému kódu, což vývojářům umožňuje přístup k základnímu nativnímu nebo spravovanému systému.

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

Diagram znázorňující základní přehled diagramu architektury

Nativní a spravovaný kód

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

Nativní kód je kód, který bude běžet nativně na konkrétní platformě (například dokonce zkompilovaný kód Objective-C AOT na čipu ARM). Tato příručka popisuje, jak se spravovaný kód kompiluje do nativního kódu, a vysvětluje, jak funguje aplikace Xamarin.Mac, a plně využívá rozhraní MAC API společnosti Apple prostřednictvím vazeb a zároveň má přístup k . Seznam BCL technologie NET a sofistikovaný jazyk, jako je C#.

Požadavky

Při vývoji aplikace pro macOS pomocí Xamarin.Mac je potřeba:

  • Mac se systémem macOS Sierra (10.12) nebo vyšší.
  • Nejnovější verze Xcode (nainstalovaná z App Store)
  • 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 verze 10.7 nebo vyšší.

Kompilace

Při kompilaci libovolné aplikace platformy Xamarin se spustí 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 použije kompilátor JIT (Just in Time) za běhu ke kompilaci nativního kódu, což umožní spuštění na správné architektuře podle potřeby.

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é jsou spouštěny.

U aplikací Xamarin.Mac je mono obvykle vložené do sady aplikací (označované jako Embedded Mono). Při použití klasického rozhraní API Xamarin.Mac by aplikace místo toho mohla používat System Mono,ale tato funkce není v Unified API. System Mono odkazuje na mono, který je nainstalovaný v operačním systému. Při spuštění aplikace bude tato funkce používat aplikace Xamarin.Mac.

Voliče

S Xamarinem máme dva samostatné ekosystémy , .NET a Apple, které musíme spojit, aby se zdály co nejjednoduché, aby bylo zajištěno, že konečným cílem bude bezproblémové uživatelské prostředí. V části výše jsme viděli, jak tyto dva moduly runtime komunikují, a možná jste velmi dobře slyšeli o pojmu "vazby", který umožňuje použití nativních rozhraní API pro Mac v Xamarinu. Vazby jsou podrobně vysvětleny v souboru , takže se teď podíváme, jak Objective-C binding documentation Xamarin.Mac funguje pod pokličkou.

Nejprve musí být způsob, jak vystavit v Objective-C jazyce C#, což se provádí prostřednictvím selektorů. Selektor je zpráva, která se odesílá do objektu nebo třídy. Díky Objective-C tomu se to provádí prostřednictvím Objective-C funkcí. Další informace o používání selektorů najdete v příručce k Objective-C Selectors iOSu. Musí také být způsob, jak vystavit spravovaný kód pro , což je složitější vzhledem k tomu, že neví nic o Objective-CObjective-C spravovaném kódu. K tomu použijeme registrátora " data-linktype="relative-path">registrar . To je podrobněji vysvětleno v další části.

Registrar

Jak je uvedeno výše, registrar je kód, který zveřejňuje spravovaný kód pro Objective-C . Dělá to tak, že vytvoří seznam všech spravovaných tříd odvozených z objektu NSObject:

  • Pro všechny třídy, které nezabalují existující třídu, se vytvoří nová třída se členy zrcadlícími všechny spravované Objective-CObjective-CObjective-C členy, které mají [Export] atribut .
  • V implementacích každého člena Objective–C se automaticky přidá kód pro volání zrcadlené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 ()
    {
    }
 }

(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 , které používá k tomu, aby věděl, [Register] že objekt musí být vystaven [Export]registrar . Objective-C Atribut [Register] slouží k zadání názvu vygenerované třídy v případě, že Objective-C výchozí vygenerovaný název není vhodný. Všechny třídy odvozené z objektu NSObject jsou automaticky zaregistrovány pomocí Objective-C . Požadovaný atribut [Export] obsahuje řetězec, což je selektor použitý ve vygenerované Objective-C třídě.

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

  • Dynamické registrars – toto je výchozí nastavení pro všechna sestavení registrar Xamarin.Mac. Dynamická registrar registrace všech typů v sestavení za běhu. Dělá to pomocí funkcí poskytovaných Objective-C rozhraním API modulu runtime . Dynamická registrar aplikace má proto pomalejší spouštění, ale rychlejší dobu sestavení. Nativní funkce (obvykle v jazyce C) nazývané geopoliny se používají jako implementace metod při použití dynamického registrars . Liší se mezi různými architekturami.
  • Static – statické generuje kód během sestavení, který je pak zkompilován do statické registrars knihovny a propojen do registrarObjective-C spustitelného souboru. To umožňuje rychlejší spuštění, ale během sestavování trvá déle.

Spuštění aplikace

Spouštěcí logika Xamarin.Mac se bude lišit v závislosti na tom, jestli se používá vložené nebo systémové mono. Pokud chcete zobrazit kód a kroky pro spuštění aplikace Xamarin.Mac, přečtěte si soubor hlavičky spuštění ve veřejném repo xamarin-macios.

Generátor

Xamarin.Mac obsahuje definice pro každé rozhraní API systému Mac. Tyto informace si můžete projít 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ý se nazývá v Xamarin.Macu, přebírá tyto definiční soubory a pomocí nástrojů .NET je kompiluje bmac do dočasného sestavení. Toto dočasné sestavení však nelze použít k volání Objective-C kódu. Generátor pak načte dočasné sestavení a vygeneruje kód jazyka C#, který lze použít za běhu. To je důvod, proč se například při přidání náhodného atributu do souboru .cs definice ve výstupním kódu nebude zobrazovat. Generátor o tom neví, a proto neví, jestli ho má hledat v dočasném sestavení pro bmac jeho výstup.

Po Xamarin.Mac.dll vytvoří packager () všechny mmp komponenty dohromady.

Na nejvyšší úrovni toho dosahuje provedením následujících úloh:

  • Vytvořte strukturu sady prostředků aplikace.
  • Zkopírujte do spravovaných sestavení.
  • Pokud je propojení povoleno, spusťte spravovaný linker, abyste optimalizovali sestavení odebráním nepoužívaných částí.
  • Vytvořte aplikaci spouštěče, o které mluvilo propojení v kódu spouštěče, spolu s registrar kódem, pokud je ve statickém 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í se, aby z něj bylo možné vytvořit mmp balíček.

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

Souhrn

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