Department of InformatiX
Microsoft .NET Micro Framework Tools & Resources

Update červenec 2018: V roce 2011 byl .NET Reflector zpoplatněn. Místo něj doporučuji ILSpy.

Reflector je zcela základní pomůcka každého .NET vývojáře. Nejen že vám (ve většině případů) umožňuje zobrazit zdrojový kód .NET assembly, ale také hledat např. třídy nebo metody podle názvu, procházet framework a zjišťovat tak jeho možnosti nebo pomáhat rozumět kompilaci. Nejlepší na tom je, že jej můžete použít i s .NET Micro Frameworkem.

Instalujeme Lutz Roeder's .NET Reflector

  1. Stáhněte si poslední verzi zde.
  2. Rozbalte archiv do nějaké složky a spusťte Reflector.exe (aplikace běží bez instalace)::
    Screenshot Reflectoru při prvním spuštění
  3. Pokud chcete nahlížet i do .NET Frameworku, vyberte si verzi, s kterou chcete začít, jinak dejte Cancel.
  4. V menu File vyberte Open List... (nebo stiskněte Ctrl+L).
  5. Stiskněte tlačítko Add a vepište .NET Micro Framework nebo cokoliv jiného:
    Assembly List Management
  6. Po dokončení psaní stistkněte Enter a tlačítko Select. Bude vám nabídnut stejný seznam jako ve druhém budě. Tentokrát stiskněte Cancel.
  7. V menu File vyberte Open... (nebo stiskněte Ctrl+O). Najděte složku Assemblies v místě kam jste nainstalovali .NET Micro Framework SDK, např. C:\Program Files\Microsoft .NET Micro Framework\v2.5\Assemblies, vyberte všechny soubory (nebo stiskněte Ctrl+A) a stiskněte Open. Nyní byste měli vidět seznam všech .NET Micro Framework assembly, což vypadá asi takto:
    Načtné .NET Micro Framework 2.5 assembly

Chcete-li např. otevřít jinou verzi frameworku, můžete zopakovat poslední čtyři kroky. Mezi seznamy pak lze přepínat pomocí File | Open List... nebo Ctrl+L.

Běžné úkony

Většina lidi používá Reflector k nahlížení do zrojových kódů assembly. Bohužel v .NET Micro Frameworku je většina věcí implementována na úrovni CLR nebo níže, kam se Reflectorem nedostaneme. Takové metody jsou označeny jako extern. Například, rozbalte strom abyste se dostali k Microsoft.SPOT.Hardware > Microsoft.SPOT.Hardware.dll > Microsoft.SPOT.Hardware > OutputPort > Write(Boolean) : Void. V okně pod stromem můžete vidět, že je tato metoda deklarována jako public extern. To znamená, že je implementována v nativním kódu - vskutku, různé procesory mohou mít různý způsob zapisování hodnot na piny.

Prohlížení zdrojových kódů

Některé části frameworku jsou však psány v C#, např. DPWS knihovny nebo ovládací prvky WPF. Podívejme se na ně: otevřete Microsoft.SPOT.TinyCore > Microsoft.SPOT.Tinycore.dll > Microsoft.SPOT.Presentation.Controls > Border. K zobrazení kódu této třídy pak stačí stisknout mezerník nebo zvolit Disassemble v menu Tools. Okno Reflectoru se zvětší a uvidíte jakousi kostru třídy:

Zdrojový kód třídy Border

Kliknete-li nyní na slova Expand Methods, uvidíte kompletní zdrojový kód této třídy, který můžete celý zkopírovat a vložit do svého projektu. Nebo můžete strom ještě o jednu úroveň rozbalit a prohlížet si implementace jednotlivých metod samostatně. Kliknutím na cokoliv v okně se zdrojovým kódem vás přenese na deklaraci, čímž můžete kód vizuálně krokovat.

Poznámka: Běžné konstruktory jsou zobrazeny jako metoda .ctor statické jako ..ctor. Šedivý text představuje neveřejné typy nebo členy (tj. nemůžete je přímo použít ve svém projektu).

Hledání třídy nebo členu

Pokud sháníte nějaký konkrétní objekt, klikněte na View | Search (nebo stiskněte F3). Otevře se okno Search, do kterého můžete vepsat, co hledáte. Seznam výsledků bude obsahovat položky, které obsahují vaše klíčové slovo buď ve svém názvu nebo namespace. Můžete použít mezery k určení více slov, které musí položka všechny obsahovat:

Hledání 'dpws handler'

Jak je vidět lze tento postup použít nejen k hledání typu v konkrétní namespace nebo k zobrazení všechy typů z jedné namespace napříč všemi assembly, ale také ke zjištění, ve které assembly je typ deklarován, abyste ji mohli přidat jako referenci ke svému projektu. K prohledávání názvů členů (jako třeba metod nebo vlastností) klikněte na druhou ikonku s obrázkem vlastnosti (nebo stiskněte Ctrl+M). Dvojklikem na výsledek jej pak můžete zobrazit ve stromu.

Sledování dědičnosti

Užitečné může být také znát všechny předky vašeho typu, nebo zjistit, které třídy jej dědí. Abychom ku příkladu zjistili, které panely .NET Micro Framework obsahuje, otevřete Microsoft.SPOT.TinyCore > Microsoft.SPOT.TinyCore.dll > Microsoft.SPOT.Presentation.Controls > Panel > Derived Types (nebo jen dejte hledat 'panel' a dvakrát na něj klikněte):

Implementace Panelu

Moc jich není, že? :)

Analyzer

Dalším trikem je třeba dohledat, odkud je naše metoda volána. To lze zjistit pomocí Analyzeru. Zkusme analyzovat typ System.Ext.Guid z assembly MFDpwsExtensions. Klikněte na něj pravým tlačítkem/menu Tools | Analyze (nebo stiskněte Ctrl+R).

Analyzer

Zobzrazení podle namespace

Pokud upřednostňujete procházení frameworku podle jmenných prostorů, v menu View zvolte Options.... V sekci Browser zaškrtněte Flatten namespaces. Tím uvidíte všechny typy v daném namespace:

Strom dle namespace

Všechny třídy na obrázku pochází z assembly Microsoft.SPOT.Hardware, až na ScreenMetrics z Microsoft.SPOT.Graphics a SystemID a Utility, které jsou z Microsoft.SPOT.Native, jak je vidět z okna pod stromem.

Zodpovídání vašich dotazů

Jakou referenci mám přidat abych mohl použít namespace System.Ext?

Nevíme sice přesně, který typ tazatel shání, ale pokud dáte hledat 'system.ext', zjistíte, že všechno z této namespace pochází z assembly MFDpwsExtensions.

Je v .NET Micro Frameworku nějaký guid typ?

Zjistili jsme, že nemáme k dispozici System.Guid. Nicméně, hledáním 'guid' celkem bez potíží narazíme na implementaci v prostoru System.Ext.

Jak nastavím to správné časové pásmo?

Víme, že TimeZone.CurrentTimeZone nám umožní získat aktuální časové pásmo, ale tato vlastnost je jen pro čtení. Hledání 'timezone' v typech nijak nepomůže, ale pokud přepnete na hledání členů, uvidíte tu správnou metodu. Nebo pokud víte co hledáte, můžete mezi členy zkusit hledat 'set timezone', což vám vrátí snad všechny metody které budete kdy potřebovat.

Musím volat Invalidate() z UI vlákna?

Podívejme se, co tato metoda dělá. Hledejte 'invalidate' mezi členy (ikonka vlastnosti). Pokud použijete také ikonku s rovnítkem k omezení výsledků na přesnou shodu, bude to jediný výsledek hledání; jinak zvolte metodu Invalidate třídy UIElement. Dvakrát na ni klikněte, abychom ji našli ve stromu. Stiskněte mezerník k zobrazení zdojového kódu. Obsahuje jedinou řádku - volání metody PropagateFlags. Klikněte na ni, abychom viděli její kód. Zjistíte, že volá metodu MediaContext.PostRender(). Stejně jako před tím, klikněte na slova PostRender. A jsme tu, pohledem na Dispatcher.BeginInvoke je zřejmé, že renderování je vloženo do fronty vlákna dispatcheru, tudíž můžete volat Invalidate() z kteréhokoliv vlákna potřebujete.

Doufám, že vám tento úvod pomůže naučit se něco nového, a že si budete umět na některé otázky již odpovídat sami!

PS: Přidání do Visual Studia

Reflector lze spouštět přímo z Visual Studia. Klikněte na menu Tools | External Tools.... Stiskněte tlačítko Add. Do pole Title napište .NET &Reflector a po kliknutí na tlačítko se třemi tečkami u pole Command najděte váš Reflector.exe. Nyní stačí kdykoliv stisknout Alt+T, R (nebo na něj kliknout v menu Tools) a Reflector se spustí.

Comments
Sign in using Live ID to be able to post comments.