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:
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 mmp
seskupí 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.