.NET Micro Framework přichází s propracovanou a hlavně rozšířitelnou architekturou emulátoru. Bohužel projekty k vytváření emulátorů ve Visual Studiu nás nutí používat poněkud překonanou technologii - Windows Forms. Steve již naznačil, že se v sérii článků bude věnovat vyvíjení emulátoru pro Windows Presentation Foundation. Přesto jsem se rozhodl, že svůj již napsaný článek publikuji, pro případ, že někdo z vás nemůže již déle čekat. :-)
Emulátory jsou .NET aplikace jako každá jiná. Proto by teoreticky neměl být problém vytvořit emulátor jako např. windowsovskou službu, nebo třeba v rámci Windows Workflow Foundation. :-)
.NET Micro Framework SDK pro vás připravilo nový typ projektu Device Emulator, určený speciálně pro tvorbu emulátorů. Přináší tři hlavní funkce, které si budeme v případě vlastního projektu muset obstarat sami. Tou první je registrace emulátoru do Visual Studia. Díky tomu se hned po té, co váš nový emulátor prvně zkompilujete, objeví v seznamu emulátorů ve vlastnostech .NET Micro Framework aplikace. Dále tento emulatorový projekt vygeneruje prázdný konfigurační soubor Emulator.config, a zajišťuje jeho automatické načtení při spuštění emulátoru. Nakonec samozřejmě vygeneruje vlastní šablonu emulátoru, třídu dědící Microsoft.SPOT.Emulator.Emulator.
V čem je tedy potíž? Proč jednoduše nepoužít tento projekt a nevytvořit např. okno Windows Presentation Foundation místo Windows Forms? Problém je, že WPF aplikace, stejně jako některé ostatní, je speciální typ projektu. Dokud váš emulátor nebude označen jako projekt tohoto typu, budete mít na výběr pouze standardní typy souborů (a to mám ještě podezření, že User Control (WPF) je nabízen omylem):
Prvním řešením je vytvořit ten typ projektu, který potřebujete, a funkcionalitu emulátoru do něj prostě nějak protlačit. Tím samozřejmě přijdete o výhody uvedené výše. Pokusme si je nyní nahradit.
Registrace do Visual Studia není nijak obtížná - jedná se o krátký zápis do registrů:
string keyBase = @"HKEY_CURRENT_USER\Software\Microsoft\.NETMicroFramework\v3.0\Emulators\MyEmulator"; Microsoft.Win32.Registry.SetValue(keyBase, "Name", "My Emulator"); Microsoft.Win32.Registry.SetValue(keyBase, "Path", @"C:\Path\To\MyEmulator.exe"));
To samozřejmě není příliš univerzální cesta - musíte si hlídat verzi frameworku, a pokud se tým rozhodně změnit strukturu v registrech, nebo přidá další kroky nutné k registraci emulátoru, stěží se to dozvíte. Na druhou stranu je toto nejspíš jediná distribuovatelná možnost. Visual Studio ve skutečnosti používá třídu RegisterEmulator v assembly Microsoft.SPOT.Tasks.dll, kterou najdete v SDK složce Tools. Pokud se spolehnete na to, že uživatel má nainstalovaný .NET Micro Framework SDK (což není úplně nerozumný předpoklad), můžete ji využít také. K registraci pak stačí:
new Microsoft.SPOT.Tasks.RegisterEmulator { SubkeyName = "MyEmulator", Name = "My Emulator", Path = @"C:\Path\To\MyEmulator.exe" }.Execute();
Standardní projekt emulátoru obsahuje soubor prázdný Emulator.config, kterým je možné měnit konfiguraci emulátoru, aniž by jej bylo třeba znovu kompilovat. Během kompilace se pak tento soubor kopíruje do složky s emulátorem, se stejným názvem jako spustitelný soubor a příponou .emulatorconfig. Tento luxus lze nahradit následujícím postupem:
Nyní zbývá přidat do projektu odkaz na Mirosoft.SPOT.Emulator assembly a při spuštění aplikace spustit i třídu emulátoru zavoláním metody MyEmulator.Start(), můžete emulátor spustit i v jiném vlákně. Výchozí projekt emulátoru funguje tak, že se v metodě Main vytvoří a spustí emulátor, a vše ostatní co ke spuštění vaší aplikace potřebujete se odehrává v metodě emulátoru InitializeComponent():
Samozřejmě není problém udělát to obráceně, a spustit instanci emulátoru až z vaší služby nebo aplikace.
Udělejme z obyčejné konzolové aplikace emulátor.
Druhou možností je využít nabízený emulátorový projekt se vším všudy, a propašovat do něj vámi požadovanou technologii. Visual Studio rozlišuje typy projektů (např. Windows Forms Application × WPF Application × ASP.NET Web Application × Word 2007 Add-in atd.), a podle toho upravuje chování projektu a zpřístupňuje patřičné typy souborů (Windows Form × WPF Window × Web Form × Word Document atd.). Typ každého projektu je uložen v souboru .csproj ve formě GUID. Pokud například vytvoříte projekt typu WPF Application a podívate se třeba poznámkovým blokem na soubor projektu, uvidíte <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <AssemblyName>WpfApplication1</AssemblyName> <OutputType>WinExe</OutputType> <RootNamespace>WpfApplication1</RootNamespace> <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> <ProductVersion>9.0.30729</ProductVersion> <ProjectGuid>{34895117-845f-4fef-9ea4-26211b9c3d15} </ProjectGuid> ... </PropertyGroup> ...
Element ProjectTypeGuids určuje, o jaký projekt se jedná. {60dc8134-eba5-43b8-bcc9-bb4bc16c2548} znamená WPF aplikaci, {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} znamená jazyk C#. Jak již asi tušíte, stačí tyto GUID vzít a vložit do projektového souboru vašeho emulátoru. Pokud již element ProjectTypeGuids obsahuje, vložte do něj tyto GUID oddělené středníkem, pokud ne, založte jej, tak jako je v předchozí ukázce, do prvního elementu /Project/PropertyGroup. Uložte, a projekt znovu otevřete ve Visual Studiu. A když teď budete chtít přidat soubor, čeká na vás pestrá nabídka:
Pokud máte nainstalovaný .NET Micro Framework SDK, dočetli jste až sem a chcete aby se váš projekt libovolného typu choval jako emulátor aniž byste museli tuto funkčnost nějak složitě a ručně nahrazovat tak, jak jsme činili výše, mám pro vás sladké překvapení - nemusíte. Stačí si v projektovém souboru emulátoru všimnout některých nápadných částí:
Vložte vyznačené řádky do projektu vašeho typu, a rázem získají funkčnost emulátoru. Připomínám, že se jedná o pomoc při tvorbě emulátorů, bez které se lze obejít (např. pokud vám nevyhovuje automatická reistrace). Bez .NET Micro Framework SDK nebude tento trik ani funkční. Pokročilí vývojáři mohou nahlédnout a upravit si zmíněné soubory typu .targets ke své libosti (např. jen vypnout onu registraci) - ale běda jestli někoho uvidim v diskusní skupině že si rozhodil studio a neví co s tím... :-)