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
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
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
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!
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
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
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
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
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
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
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
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:
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
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