Architektura technologie .NET

Informace o předmětu, projektech, zápočtech a zkouškách naleznete na stránkách předmětu.

Cvičení 11

Řešení

WCF

Vytvořte novou WCF službu, nadefinujte jí jednu jednoduchou metodu (můžete použít vzorovou) a spusťte ji. Dále vytvořte konzolovou aplikaci, kde na tuto službu přidáte referenci a metodu zavoláte. Přidejte této metodě další parametr, znova spusťte konzolovou aplikaci a sledujte její chování.

Nyní nadefinujte nové chování služby:

  • Ve službě definujte novou třídu ATNETStudent, která bude obsahovat vlastnost Name a Score
  • Vytvořte statickou třídu DatabaseImitation, která bude uchovávat kolekci studentů
  • První metoda WCF služby přidá studenta do kolekce
  • Druhá metoda vrátí kolekci studentů, kteří mají skóre alespoň takové, jaké je zadáno v parametru

Znova spusťte konzolovou aplikaci a sledujte její chování. Po neúspěšném pokusu o zavolání aktualizujte referenci na službu a metody nyní korektně zavolejte.

Getting Started with WCF: https://msdn.microsoft.com/library/ee354180.aspx

Lokalizace

  • Na stránku přidejte dvě tlačítka: Czech a English
  • Po jejich stisku přidejte do Contextu název požadované kultury a přesměrujte stránku na další, která do Cookies kulturu zapíše (Server.Transfer)
  • V Global.asax nastavte při každém requestu aktuálnímu vláknu požadovanou kulturu
  • Lokalizujte title tag každé stránky pomocí Global Resources
  • Lokalizujte hlášky jednotlivých stránek pomocí Local resources

Context: https://msdn.microsoft.com/en-us/library/system.web.httpcontext.items(v=vs.110).aspx

Server: https://msdn.microsoft.com/en-us/library/system.web.httpserverutility(v=vs.110).aspx

Resources: https://msdn.microsoft.com/en-us/library/ms227427.aspx

Cvičení 10

Řešení

Tvorba vlastních komponent

Vytvořte knihovnu, která bude definovat novou komponentu – jednoduchou kalkulačku:

  • Jako vstup poslouží dva TextBoxy a jeden DropDownList (operace)
  • Vlastnost Result vrátí výsledek
  • Komponenta bude na výstupu vykreslena v tabulce (metoda Render)

V aplikaci komponentu použijte (můžete použít aplikaci z cvičení 9):

  • Vhodně zpracujte výsledky operací
  • V případě chyby přesměrujte uživatele na chybovou stránku (customErrors), na které vypíšete detaily výjimky (třída Server)
  • Napište Handler, pomocí kterého na chybové stránce zobrazíte obrázek smutného obličeje uložený ve složce App_Data
  • Detaily o výjimce bude možné z chybové stránky odeslat po napsání emailu. Ten bude muset být vyplněný a ve správném formátu (použijte validátor)

Composite Control: https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.compositecontrol(v=vs.110).aspx

Custom Errors: https://msdn.microsoft.com/library/h0hfz6fc(v=vs.100).aspx

Server: https://msdn.microsoft.com/en-us/library/system.web.httpserverutility(v=vs.110).aspx

Handler: https://msdn.microsoft.com/en-us/library/ms228090.aspx

Validátory: https://msdn.microsoft.com/en-us/library/aa479013.aspx

Cvičení 9

Řešení

Základy tvorby webových aplikací

Vytvořte jednoduchou webovou aplikaci o třech stránkách, které budou mít pouze jedno společné menu (Master Page).

První stránka:

  • Umožní uživateli postupně zapisovat seznam jmen (využijte kolekce ViewState), který bude celý uživateli zobrazen (událost PreRender)
  • Po stisku tlačítka Přesměrovat přejde aplikace na druhou stránku (pomocí Response) s Query stringem obsahující první zapsané jméno

Druhá stránka:

  • Vypíše první zapsané jméno z Query stringu (pomocí Request) do objektu Label
  • Dále tato stránka bude obsahovat tlačítka Přihlásit a Odhlásit
  • Pokud Query string nebude vyplněn, tlačítko Přihlásit bude neaktivní
  • Po stisku tlačítka Přihlásit bude do Session zapsán aktuální uživatel
  • Po stisku tlačítka Odhlásit vyčistíme Session
  • Aktuálně přihlášený uživatel bude v menu vypsán pomocí Inline expression

Třetí stránka:

  • Bude obsahovat tlačítka Czech a English
  • Po stisku příslušného tlačítka bude do Cookies zapsán zvolený jazyk
  • Čas exspirace Cookie bude nastaven v konfiguračním souboru
  • Aktuálně zvolený jazyk bude na stránce vhodným způsobem zobrazen

Vždy ověřte funkčnost ViewState, Session nebo Cookies!

Master Pages: http://www.asp.net/web-forms/overview/older-versions-getting-started/master-pages/creating-a-site-wide-layout-using-master-pages-cs

Page Life Cycle: https://msdn.microsoft.com/en-us/library/ms178472.aspx

Request: https://msdn.microsoft.com/en-us/library/system.web.httprequest.aspx

Response: https://msdn.microsoft.com/en-us/library/system.web.httpresponse(v=vs.110).aspx

ViewState: https://msdn.microsoft.com/en-us/library/ms972976.aspx

Session: https://msdn.microsoft.com/en-us/library/ms178581.aspx

Cookies: https://msdn.microsoft.com/en-us/library/system.web.httpcookie(v=vs.110).aspx

Inline Expressions: https://msdn.microsoft.com/en-us/library/k6xeyd4z(v=vs.100).aspx

Cvičení 8

Řešení

XML

Pomocí třídy XmlWriter vytvořte XML soubor s podobnou strukturou, jako má ukázkový soubor zde: http://www.w3schools.com/xml/simple.xml. Tento soubor následně přečtěte pomocí třídy XmlDocument.

Vytvořte třídu MyXmlClass, která bude obsahovat např. 4 různé vlastnosti. Serializujte instanci této třídy do souboru, soubor upravte a zpátky deserializujte. Zkuste využít atributů XmIgnore a XmlAttribute.

XmlWriter: https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter(v=vs.110).aspx

XmlReader: https://msdn.microsoft.com/en-us/library/system.xml.xmlreader%28v=vs.110%29.aspx

XmlDocument: https://msdn.microsoft.com/en-us/library/system.xml.xmldocument%28v=vs.110%29.aspx

XmlSerializer: https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer%28v=vs.110%29.aspx

Streamy - pokračování

Pomocí třídy MemoryStream serializujte instanci z předchozího příkladu pouze do paměti a výsledek vypište do konzole.

Vygenerovaný XML soubor z předchozího příkladu zkomprimujte např. pomocí třídy GZipStream.

Bonus: použijte třídu XmlDocument z prvního příkladu pro zápis a třídu XmlReader pro čtení XML souboru.

MemoryStream: https://msdn.microsoft.com/en-us/library/system.io.memorystream%28v=vs.110%29.aspx

GZipStream: https://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream%28v=vs.110%29.aspx

Cvičení 7

Řešení

Diagnostika

Pomocí tříd Debug a Trace vypisujte informace o chování aplikace. Využijte např. následujících metod:

  • WriteLine
  • WriteLineIf
  • Indent/Unindent
  • Assert
  • Fail

Aplikaci následně spusťte jak v módu Debug, tak v módu Release.

Výpis provádějte nejdříve do implicitního listeneru, pak zkuste nastavit výstup také do konzole. V app.config souboru nastavte dále výpis do logovacího souboru.

Vyzkoušejte použití atributu Conditional.

Instrumentace: https://msdn.microsoft.com/en-us/library/aa983649(v=vs.71).aspx

Článek o trasování: http://www.zive.cz/clanky/poznavame-c-a-microsoft-net---72-dil---zapis-ladicich-a-trasovacich-informaci/sc-3-a-130315/default.aspx

ConditionalAttribute: https://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute%28v=vs.110%29.aspx

Služby

Vytvořte Windows službu, která bude v daném časovém intervalu měřit vytížení CPU a zapisovat jej do souboru. Cesta k souboru a časový interval budou nastaveny v konfiguračním souboru služby.

Pomocí příkazové řádky tuto službu nainstalujte (installutil.exe).

Služby: https://msdn.microsoft.com/en-us/library/zt39148a%28v=vs.110%29.aspx

CPU: http://stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c

Instalace: https://msdn.microsoft.com/en-us/library/sd8zc8ha%28v=vs.110%29.aspx

Cvičení 6

Řešení

Sledování změn na disku

Vytvořte aplikaci, která bude ve vámi zadaném adresáři sledovat všechny změny – vytvoření, smazání nebo přejmenování souboru (třída FileSystemWatcher).

Informace o změnách budou vypisovány do konzole. Rozšiřte vyhledávání změn také na podadresáře.

Více na https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

Práce s izolovaným úložištěm

V izolovaném úložišti vytvořte logovací soubor, do kterého budete všechny změny zaznamenávat (třídy IsolatedStorageFile a IsolatedStorageFileStream).

Více na https://msdn.microsoft.com/en-us/library/3ak841sy(v=vs.110).aspx

Práce s maily

Při vložení nového souboru zjistěte velikost všech souborů v adresáři (nejlépe za použití třídy DirectoryInfo, extension metody Sum a lambda výrazu).

Pokud je tato velikost větší, než X bytů, odešlete na vaši adresu mail s upozorněním o překročení povolené velikosti (třídy MailMessage a SmtpClient). Tělo mailu bude obsahovat pomocí LINQu sestupně seřazené názvy souborů, které překročily velikost Y bytů.

V příloze mailu zašlete také logovací soubor z izolovaného úložiště.

Více o mailech na https://msdn.microsoft.com/en-us/library/system.net.mail(v=vs.110).aspx

Více o adresářich a souborech na https://msdn.microsoft.com/en-us/library/system.io.directoryinfo(v=vs.110).aspx

Volání unmanaged kódu

Použijte metodu CreateSymbolicLink z knihovny kernel32.dll k vytvoření odkazu na vámi zvolený adresář (http://www.pinvoke.net/default.aspx/kernel32.createsymboliclink).

Cvičení 5

Řešení

Globalizace

Vypište seznam všech specifických kultur a názvů měn v jejich regionu.

Přidejte Resource soubory pro alespoň dvě kultury/dva jazyky. Všechny hlášky v programu pak budou vypisovány na základě těchto souborů a aktuální kultury. Zkuste také tuto kulturu změnit.

CultureInfo: https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.110%29.aspx

ResourceManager: https://msdn.microsoft.com/en-us/library/system.resources.resourcemanager(v=vs.110).aspx

Networking

Pomocí třídy WebClient získejte svou veřejnou IP např. z adresy http://ping.eu/.

S pomocí tříd TcpListener, TcpClient a NetworkStream vytvořte jednoduchý klient-server komunikátor (pouze výměna řetězců). Klient pošle serveru zvolenou operaci (1, 2, 3…) a server následně vrátí výsledek:

  • Datum a čas serveru
  • Seznam kultur a měn
  • Veřejnou IP serveru

K posílání/čtení zpráv můžete využít následujícího kódu:

    public static class Extensions
    {
        public static void WriteMessage(this TextWriter writer, string message)
        {
            writer.WriteLine(message.Length);
            writer.Write(message);
        }

        public static string ReadMessage(this TextReader reader)
        {
            int length = Convert.ToInt32(reader.ReadLine());
            StringBuilder sb = new StringBuilder(length);

            for (int i = 0; i < length; i++)
            {
                sb.Append((char)reader.Read());
            }

            return sb.ToString();
        }
    }

Bonus: spusťte jak klienta, tak server v jednom procesu (ne ve dvou různých aplikacích).

WebClient: https://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx

TcpListener: https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=vs.110).aspx

TcpClient: https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(v=vs.110).aspx

NetworkStream: https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream(v=vs.110).aspx

Cvičení 4

Řešení

Reflexe

Vytvořte knihovnu tříd, která bude obsahovat třídu SimpleCalc. V této třídě vytvořte dvě proměnné x a y, veřejné metody SetXY a Add, privátní metodu Multiply a metodu ShowResult.

V testovací aplikaci tuto knihovnu za běhu nahrajte a vypište hlavičky všech metod, které jste vytvořili (využijte tříd Assembly, Type atd.). Výstup bude vypadat následovně:

    public Void SetXY(Int32 x, Int32 y)
    public Int32 Add()
    private Int32 Multiply()
    public Void ShowResult(String format)

Více na https://msdn.microsoft.com/en-us/library/ms173183.aspx

Aplikační domény

V aplikaci vytvořte novou aplikační doménu, do které nahrajte výše vytvořenou knihovnu. Po nahrání vytvořte instanci třídy SimpleCalc a získejte k ní přístup (nezapomeňte ověřit, zda pracujete s odkazem na objekt (proxy) a ne s objektem samotným).

Pomocí reflexe zavolejte metody SetXY a ShowResult s příslušnými parametry. Dále zavolejte metodu Add a vypište druhou mocninu její výsledné hodnoty.

Bonus: změňte přístup k metodě Add na privátní a upravte kód tak, aby i přesto šla tato metoda zavolat.

Více na https://msdn.microsoft.com/en-us/library/system.appdomain%28v=vs.110%29.aspx

Vytváření kódu za běhu: http://www.codeproject.com/Tips/715891/Compiling-Csharp-Code-at-Runtime

Cvičení 3

Řešení

Práce s vlákny

Pomocí třídy Timer vypisujte každou sekundu dobu běhu aplikace (s prvním výpisem počkejte dvě sekundy po startu aplikace).

V novém vlákně spusťte metodu, která bude vypisovat do konzole informace každé 1,5 sekundy.

V dalším vlákně spusťte metodu, která bude vypisovat do konzole informace každou sekundu. Počet vypsaných informací bude zadán v parametru. V metodě Main po spuštění nového vlákna počkejte na jeho vykonání a teprve pak pokračujte.

Vytvořte nový delegát s následujícím předpisem (nebo použijte systémový delegát Func):

    delegate int MyNewDelegate(int x, int y);

S tímto předpisem definujte metodu, která vrátí počet prvočísel v zadaném rozsahu. Metodu (delegát) asynchronně zavolejte a nakonec vypište výsledek.

Při výpočtu využijte metod třídy Parallel. Čítač prvočísel implementujte nejprve klasickým způsobem a ověřte, zda metoda vrací správný výsledek. Pak tento čítač upravte s použitím atomických operací (třída Interlocked).

Pomocí třídy Mutex zajistěte, abyste mohli spustit maximálně jednu instanci toho programu.

Bonus: zdůvodněte, proč první vámi vytvořené vlákno po skončení metody Main stále vypisuje informace do konzole. Alespoň dvěma způsoby tomuto chování zamezte.

Timer: https://msdn.microsoft.com/en-us/library/system.threading.timer%28v=vs.110%29.aspx

Thread: https://msdn.microsoft.com/en-us/library/system.threading.thread%28v=vs.110%29.aspx

Asynchronní volání delegátů: https://msdn.microsoft.com/en-us/library/2e08f6yc(v=vs.110).aspx

Parallel: https://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel%28v=vs.110%29.aspx

Atomické operace: https://msdn.microsoft.com/en-us/library/sbhbke0y(v=vs.110).aspx

Mutex: https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx

Cvičení 2

Řešení

Anonymní metody, Extension metody a LINQ

Použijte kód třídy Calculator z předchozího cvičení:

  • Zopakujte si volání metody Write dosazením anonymní metody
  • Zopakujte si volání metody Write dosazením lambda výrazu
  • Vytvořte extension metodu Mod, která spočte X mod Y instance třídy Calculator

Vytvořte v kódu pole celých čísel s prvky 18, 5, 4, 25, 74, 154, 9, 57, 38, 666, 42. Do nové kolekce pak z tohoto pole vyberte pouze sudé prvky vetší než 10. V této kolekci budou uloženy dvojnásobné hodnoty vybraných prvků. Prvky vybírejte následovně:

  • Klasicky pomocí cyklu for/foreach
  • Pomocí extension metod z namespace System.Linq
  • Pomocí dotazu LINQ

Prvky budou seřazeny vzestupně dle velikosti. Prvky vypište do konzole oddělené čárkou pomocí příkazu String.Join.

Více o delegátech na https://msdn.microsoft.com/en-us/library/ms173171.aspx
Více o extension metodách na https://msdn.microsoft.com/en-us//library/bb383977.aspx
Více o LINQ na https://msdn.microsoft.com/en-us/library/bb397906.aspx

Práce s grafikou

Za pomocí tříd Bitmap, Graphics a Pen (přidejte do referencí System.Drawing) vytvořte obrázek usměvavé hlavy podobný vzorovému:

Vzorový obrázek

Výsledný obrázek uložte do souboru a po skončení práce nezapomeňte uvolnit zdroje!

Více na https://msdn.microsoft.com/en-us/library/system.drawing.graphics.fromimage(v=vs.110).aspx

Cvičení 1

Řešení

Základy .NET

Měli byste znát tyto prvky/vlastnosti jazyka C#:

  • Jazyk C#
  • OOP (třídy, rozhraní, zapouzdření, dědičnost apod.)
  • Vlastnosti
  • Generické typy a kolekce
  • Delegáti a události
  • Atributy
  • Výjimky
  • Streamy

Kompilace z příkazové řádky

Kompilaci z příkazové řádky provádíme přes C# compiler (csc.exe) (přímo z Visual Studio Command Prompt nebo přes Command Line - csc.exe můžeme najít např. v adresáři C:\Windows\Microsoft.NET\Framework\v4.0.30319):

  • csc File.cs - zkompiluje File.cs a vytvoří File.exe
  • csc /target:library /out:My.dll File.cs - zkompiluje File.cs a vytvoří knihovnu My.dll
  • csc /out:Something.exe *.cs - zkompiluje všechny .cs v adresáři a vytvoří Something.exe

Více na https://msdn.microsoft.com/en-us/library/78f4aasd.aspx.

Tvorba vlastního zásobníku

Implementujte třídu MyStack reprezentovanou klasickým polem (typu int o velikosti např. 10 prvků) s metodami Push, Pop a vnitřním ukazatelem na vrchol zásobníku. Tento zásobník dále rozšiřte následujícím způsobem:

  • Přidejte zásobníku vlastnost Top, která vrátí prvek na vrcholu zásobníku
  • Upravte zásobník tak, aby mohl být použit pro ukládání různých datových typů
  • Implementujte rozhraní IEnumerable k procházení prvků uvnitř zásobníku
  • Zavolání metody Top na prázdný zásobník způsobí vyvolání výjimky
  • Vytvořte události OnPush a OnPop, které budou vyvolány v metodách Push a Pop

Bonus: veškeré zdrojové kódy zásobníku zkompilujte v příkazové řádce do knihovny StackLibrary.dll. V příkazové řádce rovněž zkompilujte spustitelný program pro jednoduchou demonstraci funkce zásobníku (nutno přidat referenci na knihovnu).

Delegáti a události

Vytvořte předpis funkce – delegáta Operation, který bude mít dva parametry typu int a také bude int vracet (jednoduchá matematická operace).

Vytvořte třídu Calculator, která bude obsahovat jedinou metodu – Write, která vypíše výsledek operace nad dvěma dosazenými operandy. Tato metoda bude mít tři parametry:

  • První operand
  • Druhý operand
  • Operace nad těmito dvěma operandy (typu Operation)

Napište testovací aplikaci, která vytvoří instanci třídy Calculator a postupně bude volat metodu Write následujícími způsoby:

  • Dosaďte instanci delegáta Operation, která bude asociována se (statickou) metodou Add
  • Dosaďte přímo (statickou) metodu Sub
  • Dosaďte anonymní metodu
  • Dosaďte lambda výraz

Přidejte třídě Calculator vlastnosti X a Y a metodu SetXY, která tyto dvě vlastnosti nastaví.

Přidejte událost OnSetXY typu EventHandler, která bude vyvolaná v metodě SetXY. V testovací aplikaci přidejte události odběratele a zavolejte metodu SetXY.

Bonus: navrhněte vlastní třídu, která bude dědit z EventArgs, a použijte ji při vyvolání události OnSetXY.

Více o delegátech na https://msdn.microsoft.com/en-us/library/ms173171.aspx
Více o událostech na https://msdn.microsoft.com/en-us/library/awbftdfh.aspx
Více o extension metodách na https://msdn.microsoft.com/en-us//library/bb383977.aspx