.Net előadás jegyzet – 6. óra
1.oldal
.NET alapszolgáltatások 2.
Directory-k kezelése (Példák : DirectoryDateTimeRunEnv alkalmazás) Ellenőrzés könyvtár létrehozása előtt: if (!Directory.Exists("test")) Directory.CreateDirectory("test");
Könyvtár kezelése: DirectoryInfo di = new DirectoryInfo(@"c:\windows\system32"); // ha nem létezik a fájl akkor kivételt dob
windows könyvtárak lekérdezése .GetDirectories() fileok hasonlóan .GetFiles Sok beépített metódus, és függvény Path osztály könyvtér útvonalak manipulálására Path.Combine () //összekombinál kettőt StringBuilder files = new StringBuilder(); foreach (FileInfo fi in di.GetFiles()) { files.Append(fi.Name[0]); } Console.WriteLine(files.ToString()); Console.WriteLine(Path.Combine("c:\\windows", " system32")); Console.WriteLine(Path.Combine("c:\\windows\\", "system32")); Console.WriteLine(Path.GetFileNameWithoutExtension(@"c:\WINDOWS\iis6.log"));
Dátumkezelés Lekérdezés megadás különbség formátum A DateTime Struktúra, ezért érték típusú. Legyen dt dátum A dátumok különbsége dt-bday napokban. Formátum: az év: yyyy a hónap: M-1 karakteren, MM-2 karakteren, MMM-rövidítés, MMMM- teljes kiírás DatetTime.ToString leírás megnézése HF
.Net előadás jegyzet – 6. óra
2.oldal
DateTime dt = DateTime.Now; Console.WriteLine(dt); DateTime birth = new DateTime(1981, 1, 22); TimeSpan timeSpan = dt - birth; Console.WriteLine(timeSpan.TotalDays); Console.WriteLine(dt.ToString("yyyy.M")); Console.WriteLine(dt.ToString("yyyy.MM")); Console.WriteLine(dt.ToString("yyyy.MMM")); Console.WriteLine(dt.ToString("yyyy.MMMM"));
Stream-ek Van sokféle Stream, ezeken keresztül megy az IO, ebből lehet példányosítani FileStream-et, BufferStream-et stb. Byte tömböt kiírni/beolvasni. Írni/olvasni lehet-e, Seek-elni lehet-e? Saját Steam-eket adott protokoll szerint végzik az IO-t. StreamWriter StreamReader Binary ld. múlt óra System.IO alapból benne van! using System.IO; //StreamReader sr= new StreamReader(); //hf. Memória stream: Memória kiküldünk bytokat 5 byteon-ként buffereljük és csak akkor írja ki a képernyőre. Azt i változót byteban kiírjuk és a Memória stream hosszát Akkor hasznos, ha az adatátvitel gyors, de inicializálás és lezárás lassú. A buffer ürítése: bs.Flush(); //nem életszerű példa de példa! private static void SimpleStreamEx() { MemoryStream ms = new MemoryStream(); BufferedStream bs = new BufferedStream(ms, 5); for (int i = 0; i < 15; i++) { bs.WriteByte(Convert.ToByte(i)); Console.WriteLine("{0} - {1}", ms.Length, i); } bs.Flush(); }
.Net előadás jegyzet – 6. óra
3.oldal
Futási környezet Megírsz egy programot és odaadod felhasználónak, de ő a Windows-t máshova telepítette, te a profiljába el akarsz valamit helyezni onnan kiolvasni, stb. Mik a helyi beállításai le kell tudni kérdezni. Futási környezet információi: - környezeti változók - könyvtár elérési útvonalak - process-ek - … //Microsoft Command Shell (MSH) System.Enviroment osztályban van SpecialFolder, ami megmond minden okosságot egy enumot ad vissza a myDoc-ba stringben visszaadjuk. Gépenként változhatnak a beállítások, Így kell lekérdezni a path-okat: string myDoc = System.Environment.GetFolderPath (System.Environment.SpecialFolder.MyDocuments); Console.WriteLine(myDoc); Milyen processzeket futtatunk? Process p =folyamat. Lekérdezzük a nevét. Pl. olyan, mint a Task Managerben foreach-nél kell a try! (megszűnhet lekérdezés közben, nincs jogunk lekérdezni) Megmondja milyen külső modulokat rántott be. Használható például diagnosztikai alkalmazásoknál, melyik process milyen dll-t rántott be. Bárki írhat olyan alkalmazást, ami fogja a dllt? //vannak már kész alkalmazások is: www.sysinternals.com -rakat diagnosztika, security, érdekes, HF megnézni, most már a technet része(megvették) http://technet.microsoft.com/hu-hu/sysinternals/default(en-us).aspx Process p = Process.GetCurrentProcess(); Console.WriteLine(p.ProcessName); foreach (Process proc in Process.GetProcesses()) { try { Console.WriteLine(proc.ProcessName); foreach (ProcessModule pm in proc.Modules) { Console.WriteLine(" " + pm.FileName); }
.Net előadás jegyzet – 6. óra
4.oldal
} catch { } }
Protocol-spec hálózati szolgáltatások Két lehetőség van a kezelésre: - magas szintű - alacsony szintű (bonyolultabb de többet tud) A http protokoll (nem bonyolítjuk a témát) egyszerűen letöltünk egy oldalt. using System.Net; Magas szintű kezelés: wc.OpenRead nyissunk meg egy servert (pl avalon), olvassunk a SteramReader-rel usinggal kezeljük a streameket. Eredmény: kidobta a html kódot, amit kapott. WebClient wc = new WebClient(); using (StreamReader sr = new StreamReader(wc.OpenRead( "http://avalon.inf.elte.hu"))) { Console.WriteLine(sr.ReadToEnd()); } Le lehet kérdezni a headereket: wc.RHeaders. Kiírjuk a kulcsát és a nevét. // wc.ResponseHeaders for (int i = 0; i < wc.ResponseHeaders.Count; i++) { Console.WriteLine("{0} - {1}", wc.ResponseHeaders.GetKey(i), wc.ResponseHeaders[i]); } Ez volt a http ről letöltés Alacson szintű Most WebRequest lesz Itt is meg kell adni az útvonalat. A kettő közt a wr-nél az egyik különbség például a cookie konténer van és autentikálom, vagy két request közt autentikálok és a másik szolgáltatásait használom, A wc nem tud cookiet kezelni. WebRequest wr = WebRequest.Create( "http://avalon.inf.elte.hu"); WebResponse resp = wr.GetResponse(); Stream rstream = resp.GetResponseStream(); using (StreamReader sr = new StreamReader(rstream))
.Net előadás jegyzet – 6. óra
5.oldal
{ Console.WriteLine(sr.ReadToEnd()); } Ki lehet olvasni a headert: WebResponse webResponse = webRequest.GetResponse(); //webResponse.GetResponseStream(); for (int i = 0; i < webResponse.Headers.Count; i++) { Console.WriteLine("{0}: {1}", webResponse.Headers.GetKey(i), webResponse.Headers[i]); }
Socket-ek ld. Tőke Pál hálózatok - tanultuk Milyen függvények vannak Server/Kliens oldalon? Mire szolgál a Listen utasítás: Figyelünk egy porton Accept utasítás: Kapcsolat elfogadása Connect: kliens oldalán kapcsolat Get Host by name: ip címet visszaad TCP: kapcsolat orientált, megbízható UDP: Stream, nem megbízható Blolocikg Socket / Non blocking socket: A Blolocikg Socket vár, amíg nem jön valami adat. Read (non blocking) nem jött adat, de nem érdekes olvass újra → CPU terhelés fel megy az égbe, erre találták ki a select utasítást. Figyeljen adott socketen olvasható socket Time out-ol, ha nem jött kapcsolat. Vár a háttérbe nem terheli a processzort vagy erőforrást. Ha jön valami, akkor nem várja ki a Time out-ot azonnal olvas. Terhelhető, robosztus több klienst tud kiszolgálni: Több szál kell! Első megközelítésben1 szál a kéréseket figyeli, ha bejön egy kérdés indítsunk egy új szálat. (Indítsunk el? Ezzel van egy kis gond!) E helyett: Van egy induló szál, ami figyeli és fogadja a kapcsolatokat (accept), ami visszaad egy message socketet, ami már csak az adott kliensre vonatkozik. Visszaadott socketet bevágja egy (várakozási/kiszolgálási)sorba. Mi fogja kiszolgálni? Szál már fut! (Thread) Na te leszel az, aki kiszolgálod ezt a klienst! Kommunikál a klienssel és utána megint kivesz egy újabb elemet a sorból. Az a szál szolgál ki mindig, amelyik nem dolgozik. Lehet még indítani újabb szálakat is, ha sok a kérés. Ha a
.Net előadás jegyzet – 6. óra
6.oldal
szerver nem annyira terhelt akkor le is lőhetem a szálat. http://kpocza.net/Programming.aspx Mohican nyílt forráskód alapok benne vannak a szerver alkalmazásban. Pluszban van még konfiguráció XML kezelés. Szabadon felhasználható. Server futtatása Kliens futtatása Írjunk egy sajátot: Egyszerű matematikai műveleteket végez. SocketLibrary Kliens: Főprogramban Socket functions-be beregisztrál CheckBufferValidity, az új sor jelig beolvassa a kérést. Buffer valid e? Recive metódusban addig olvas, amíg nem talál valódi buffert. Send-nél nincs probléma a byte tömböt kiírja. Lehetne a kérés előtt: Na most 18 byteot fogsz kapni, de itt sorvégéig olvas. Ezért delegateként beregisztrál olvasandó buffert. A DoCalk metódustt meghívta. GetHostEntry port a lokalhost-on, ezen kell kommunikálni a connect-el kapcsolódunk. Kérést és a Env. NewLine-t elküldjük. Fogadásnál kiírja a választ. Server: //ld. Mohican Reguláris kifejezéseket lehet alkalmazni vmi.namespace Regurális kifejezés: ADD| SUB stb. 2 operandus, ahol a "\d" szám, a "+" pozitív lezárt (egy vagy több szám). A csoportneve
(szintaktikája). RegexOption-t akkor fordítjuk le, ha először példányosítjuk az osztályt – mi most fordítási időben lefordítjuk a reg. kif.-t és az így elkészült kódot tudja a példány használni. Itt is a buffert beregisztrálunk. TCP listener figyel, várjuk a kérést. Fogadja a kérést, kiírjuk, majd illesztjük a reg. kifejezéssel. op1 op2 művelet //Lehet-e null? Pl osztás. visszaadja a választ HF. reg.kif. megnézése. Érdemes! (ISO szabványt használ.)
Együttműködés - Interop (Inter Operation) Hasznos ha együtt tudunk működni más technikákkal. Milyen együttműködés? Natív hívások / COM komponensekkel elérni, szolgáltatásokat elérni.
Platform hívás (PInvoke)
.Net előadás jegyzet – 6. óra
7.oldal
A Win API natív - nem managed hívás-t is el tudjam érni (egy felületet elérni) Adott valahol egy dll, amit valahogy hívnak valami szignatúrával. //ld. MSDN Nekünk meg kell határozni statikus függvényként + speciális attribútum a függvény elé: DllImport. pl. unicode-os verzió "függvény név"= "függvény a dll"-ben (de lehet propertyként is megadni.) [DllImport("msi.dll", CharSet = CharSet.Unicode)] static extern Int32 MsiEnumProducts(Int32 index, [Out] StringBuilder productGUID);
(ez lehetővé teszi a MsiEnumProducts fv hívását a programunkban) Fel kell sorolni a paramétereket, hogy milyen típus legyen. Definiálni kell a struktúrát bytrera pontosan mint a natív struktúra, de hogy épül fel ilyen struktúra? És milyen a fv-ek szignatúrája? Erre van egy ONLINE leírás ami segí a Pinvoke : http://pinvoke.net/ Itt rákeresek függvényre. Jó esetben van példa is! public NativeCalls Milyen programokat telepítettünk erre a gépre? Amíg success addig kérdezzük le a nevét a telepített cuccoknak? Length-et ad vissza, (puffer overload lehet) mennyi memória kell biztonságosan lefoglaljuk a cuccot? A StringBulder automatikusan elvégzi ezt nekünk. Ha kifele akarjuk adni: OUT kulcsszó.
COM elérése .NET-ből COM referencia hozzáadása Add Reference COM fül MS Word ... OK Mit csinál? Beszélgethetünk egy Worddel! Word és a COM osztály: a könyvtár elérhető C++ .NET COM-os felületből, így programozott technikával létrehozható word dokumentum (test.doc létrejött) Bonyolult, de lehet használni. Így bármely objektum elérhető AcrobatReader, Maple, Matlab és elérhetőek a szolgáltatásai. pl: Word doksiból PDFet konv Adobe COM interfacet hívogatjuk... "Office korszakban" jelent meg és kezd eltűnni. using System;
.Net előadás jegyzet – 6. óra
8.oldal
using System.Runtime.InteropServices; using Word = Microsoft.Office.Interop.Word; using System.IO; namespace Interop { public class COMInterop { public COMInterop() { } public static void Demonstrate() { object missing = Type.Missing; object fileName = @"c:\download\test.doc"; string text = "This Document has been created using COM Interop!"; if (File.Exists((string)fileName)) File.Delete((string)fileName); Word._Application wordApp = null; try { wordApp = new Word.ApplicationClass(); wordApp.Visible = false; Word._Document doc = wordApp.Documents.Add(ref missing, ref missing, ref missing, ref missing); object startPos = 0; object endPos = 0; Word.Range range = doc.Range(ref startPos, ref endPos); range.Text = text; doc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); doc.Close(ref missing, ref missing, ref missing); } finally { try { if (wordApp != null) { wordApp.Quit(ref missing, ref missing, ref missing); Marshal.ReleaseComObject(wordApp); } GC.Collect(); GC.WaitForPendingFinalizers(); } catch { } } } } }
.Net előadás jegyzet – 6. óra
9.oldal
.NET alapszolgáltatások 2. ............................................................................................................... 1 Directory-k kezelése ................................................................................................................. 1 Dátumkezelés ........................................................................................................................... 1 Stream-ek ................................................................................................................................. 2 Futási környezet ....................................................................................................................... 3 Protocol-spec hálózati szolgáltatások ....................................................................................... 4 Socket-ek .................................................................................................................................. 5 Együttműködés - Interop (Inter Operation) .............................................................................. 6