special,izolat de restul memoriei,in care datele de tip MSIL sunt
transformate in coduri masina.Acest mediu de executie,este de fapt un
tampon de memorie,ce poate fi procesat local,sau poate fi expediat la
orice adresa de memorie din retea.Astfel,o aplicatie .NET poate fi
executata si arhivata local,poate fi executata local si expediata la o
alta adresa de memorie din retea,sau poate fi executata la multiple adrese
din retea (adica este portabila).Singura conditie este ca la adresa de
destinatie sa existe o copie a CLR (a interpretorului).
Pe langa interpretor,platforma .NET asigura si o biblioteca extensiva
de resurse software,formata din clase,interfete,enumerari si executabile
(tools = instrumente software).Toate aceste resurse,contin principalele
tipuri de data si functii specializate pentru majoritatea operatiilor
ce se pot executa asupra acestor tipuri de data.Aplicatia nu mai trebuie
sa defineasca tipuri de data si functii,ci doar le apeleaza pe cele
standardizate.Astfel,codurile vor fi mult mai simple,mai scurte si mai
usor de verificat si depanat.
Principalele avantaje oferite de platforma .NET sunt urmatoarele:
1. -se pot combina usor modulele executabile create de autori diferiti,
de la firme si companii diferite,scrise in limbaje de programare diferite.
2. -se creaza un standard industrial comun,pentru aplicatiile ce implica
si schimb de date,sau comunicatii active in reteaua Internet.
3. -aplicatiile platformei .NET sunt puternic obiectuale,datele sunt
foarte bine protejate in nenumarate containere,asigurand astfel o foarte
buna securitate in executie.
4. -aplicatiile platformei .NET se preteaza foarte bine la orice proces
de automatizare si control automat
5. -CLR asigura managementul complet automat la memoriei cu ajutorul unui
mecanism de tip "garbage collector" asemanator cu cel din Java.
6. -asigura o compatibilitate perfecta intre diferitele versiuni ale
bibliotecilor DLL.Pentru a actualiza o astfel de biblioteca DLL,codurile
noi se adauga langa cele vechi,pastrand si functionalitatea celor perimate
7. -permite crearea unor executabile dinamice,care exista doar pentru
putin timp,doar in memoria de executie.Se pot executa astfel operatii
complexe,fara a consuma nici un byte de memorie inscriptibila.
-92-
Instalarea platformei .NET este foarte facila.Se descarca din reteaua
Internet un modul executabil,denumit dotnetfx,ce va executa automat toate
operatiile necesare.In urma instalarii,vor exista cele doua componente
distincte: mediul de executie CLR si biblioteca de clase .NET Framework
Class Library.Cele doua componente,contin urmatoarele elemente esentiale:
COMMON LANGUAGE RUNTIME
Este un sistem de operare in miniatura.Contine toate elementele
necesare pentru contentionarea si prelucrarea datelor dintr-o aplicatie.
Lucreaza cu module executabile denumite asamblari (assembly) produse de
compilatorul specializat al fiecarui limbaj de programare (csc.exe in
cazul limbajului C#).Pentru prelucrarea datelor,contine un interpretor al
limbajului MSIL,dar si un mecanism complex prin care identifica si apoi
conecteaza resursele software.Legatura dintre coduri si bibliotecile de
resurse in care se afla definitia lor,se face cu ajutorul unor metadate,
generate de compilator in momentul in care se construieste modulul
executabil.CLR,citeste metadatele din modul si apoi preia codurile necesare
din bibliotecile de clase.Dupa ce aduna si asambleaza toate elementele
necesare,CLR transforma codul intemediar in cod masina (denumit "managed
code") ce urmeaza sa fie trimis spre executie.CLR organizeaza toate
obiectele si referintele spre obiecte si tine o evidenta stricta a lor.
In momentul in care un obiect,sau o referinta nu mai este utila in
program,aceasta va fi mutat intr-un tampon de memorie auxiliar,de unde
urmeaza sa fie apoi eliberat (sters din memorie).Practic,exista mai
multe astfel de tampoane de memorie,in care datele sunt arhivate "pe
linie de asteptare",pana cand procesorul gaseste o bresa in executie
pentru eliberarea lor.Aceste tampoane au o prioritate de executie,in
functie de vechimea si importanta lor.Daca exista suficienta memorie de
executie,procesorul va executa prioritar orice alta operatie din stiva
sa de functii,dar daca memoria de executie este plina,vor avea prioritate
operatiile de eliberare a memoriei.Acest mecanism de autocontrol este
denumit generic "garbage collection" (colectarea gunoiului) si a fost
introdus pentru prima data in practica,de mediul Java.
CLR poate prelucra simultan doua sau mai multe module executabile,
chiar daca au fost generate de compilatoare diferite.Biblioteca de clase
este aceeasi,limbajul intermediar este comun,asa ca nu mai trebuie decat
sa citeasca metadatele si sa creeze conexiunile necesare dintre resurse
si coduri.In acest fel,modulele scrise in limbaje diferite pot functiona
sinergic,pentru a forma aplicatii noi.
Interpretorul pentru codurile MSIL poarta si numele de compilator JIT
(Just In Time),sau compilator instantaneu.Codurile masina sunt diferite
de la un procesor la altul,asa ca CLR trebuie sa includa cate un astfel
de compilator pentru fiecare tip de arhitectura hardware a procesorului
instalat.Este posibil ca aplicatiile .NET sa nu poata fi executate,doar
atunci cand sunt prelucrate pe un calculator cu procesor diferit de
arhitectura ce formeaza standardul comercial.Este posibil ca aplicatia
sa contina si numeroase coduri MSIL,ce nu vor fi executate decat optional
sau alternativ.Compilatorul JIT nu converteste decat codurile cu executie
imediata,crescand astfel viteza si randamentul executiei,apoi memoreaza
codurile convertite atunci cand urmeaza sa fie executate repetat.
-93-
Pe langa compilatoarele JIT,CLR contine si un alt mecanism pentru
conversia codurilor MSIL in cod masina,denumit "install-time",adica cel
generat in momentul instalarii.Prin acest mecanism,codul MSIL este
convertit complet in cod masina,in momentul instalarii in memorie si
apoi este arhivat sub forma de coduri masina.In momentul apelului,codul
masina va fi expediat spre procesor,crescand mult viteza de executie.
Acest mecanism este utilizat doar atunci cand executia nu depinde de
configuratia actuala a mediului de executie si poate fi utilizat mediul
de executie din momentul initial.
Interpretorul CLR contine si un mecansim de verificare si control,prin
care verifica daca operatiile executate nu vor genera erori de executie.
Exemplu: -daca doua sau mai multe module executate simultan solicita
operatii ce duc la suprascrierea unor adrese de memorie sau la operatii
incompatibile.Acest mecanism va verifica si politele de securitate
anexate fiecarui modul,pentru a impiedeca orice operatie neautorizata.
Toate exceptiile si erorile vor fi semnalate prin mesaje de eroare,
dublate sau nu de blocarea executiei,in functie de gravitatea erorii.
In sinteza,CLR asigura urmatoarele operatii: incarcarea si conectarea
resurselor software,verificarea erorilor,exceptiilor si a restrictiilor,
compilarea la cod masina,gestionarea memoriei,eliberarea automata a
memoriei si securizarea executiei prin contentionarea aplicatiei.
CLASS LIBRARY (bibliotecile standard)
Pentru a creste cat mai mult functionalitatea programelor,platforma
.NET ofera o colectie foarte bogata de coduri predefinite,arhivate intr-o
serie de biblioteci DLL (biblioteci cu alocare dinamica).Aceste biblioteci
contin clase,interfete si colectii de date de tip valoare.
Pentru a simplifica mamagementul memoriei,datele din biblioteci sunt
separate in containere mai mici (namespaces) cu o denumire simpla si
clara.Aceste containere sunt incluse unul in altul,intr-o ordine de tip
ierarhic,structurata dupa conexiunile ce exista intre ele.Pentru a putea
utiliza datele,se va utiliza o sintaxa in care se specifica atat numele
containerului cat si numele tipului de data apelat.
EXEMPLU: System.Collections.ArrayList desemneaza tipul de date ArrayList,
arhivat in containerul System.Collections.
Daca containerele sunt incluse unul in altul,calea de acces se va
construi cu ajutorul operatorului punct (.).
EXEMPLU:
namespace System {
namespace Collections{ ...}
}
se va scrie: System.Collections
Trebuie remarcat faptul ca o singura biblioteca poate contine numeroase
astfel de containere.Pentru a economisi memoria consumata,se poate
importa strict containerul dorit,fara a incarca intreaga fila DLL.
Cel mai important dintre containere poarta numele de System si contine
toate tipurile esentiale de data,definite sub forma de clase.Aici sunt
definite tipurile: Object,Byte,Char,Array,Int32,String...etc.Practic,
nici o aplicatie nu poate fi executata fara aceasta resursa,decat data
fiecare tip de data este definit explicit de catre utilizator.
-94-
Numarul de containere (namespaces) din biblioteca de clase,difera in
functie de versiunea .NET incarcata.Fiecare versiune noua,adauga seturi
noi de clase,grupate in containere diferite.Majoritatea lor sunt incluse
in cele doua mari containere radacina: Microsoft si System.Exista si
cateva containere izolate: Accessibility,UIAutomationClientsideProviders
si XamlGeneratedNamespace.Clasele generate de compania Microsoft sunt
grupate in containerul Microsoft.Exemple: Microsoft.Build.BuildEngine,
Microsoft.CSharp,Microsoft.JScript,Microsoft.VisualBasic,Microsoft.Win32.
Restul claselor sunt incluse in containere ce au ca radacina comuna
containerul System.Exemple: System.Activities,System.AddIn,System.CodeDom,
System.Collections,System.ComponentModel,System.Configuration,System.Data,
System.Diagnostics,System.Drawing,System.IO,System.Management,System.Net,
System.Printing,System.Redflection,System.Runtime,System.Security,System.
ServiceModel,System.Speech,System.Text,System.Web,System.Windows,System.
Workflow,System.Xaml,System.Xml...etc.Fiecare dintre aceste subcontainere
radacina,poate contine la randul sau alte subcontainere.Este important sa
cunoasteti localizarea fiecarei clase,in containere pentru a putea preciza
calea de acces completa.Daca se importa doar containerul radacina,toate
clasele din subcontainere nu vor avea vizibilitate in program.Din acest
motiv este esential sa fie importat si subcontainerul ce contine clasa.
EXEMPLU: clasa ArrayList este inclusa in System.Collections
pentru a putea fi utilizata in program,se va utiliza expresia:
System.Collections.ArrayList sau se va importa intregul container cu:
using System.Collections; //apoi se poate utiliza direct ArrayList
Daca se importa doar containerul System,ArrayList va fi nedefinita.
Biblioteca de clase .NET contine un numar enorm de clase si resurse.
Prezentarea lor este imposibil de facut intr-un singur manual.Referintele
bibliografice se gasesc in reteaua Intenet,in biblioteca MSDN,sau pentru
utilizatorii programului Visual C# pot fi verificare cu utilitarul denumit
Intelisense.
Nu exista reguli speciale pentru limbajul C#.Regulile de baza sunt
cele definite pentru programarea orientata spre obiect.Aceleasi clase,
vor fi importate si in mediu C# ca si in mediul Visual Basic.Exista doar
mici diferente in formarea expresiilor,specifice fiecarui limbaj,dar
aceste diferente dispar o data cu compilarea la limbaj intermediar.
System.Windows.Forms
Contine clasele necesare pentru construirea unei interfete grafice cu
utilizatorul,de tip Windows.Clasele sunt organizate ierarhic.Majoritatea
lor deriva din clasa Control si mostenesc toate metodele acestei clase.
O parte dintre ele formeaza ferestre si controale destinate pentru
interactiunea cu utilizatorul,altele formeaza meniuri si bare de meniu.
Exista si controale specializate pentru operatii I/O,sau pentru transferul
datelor precum si controale specializate pentru afisarea datelor fie sub
forma de text si tabele,fie sub forma grafica.Numarul acestor clase si
paleta de proprietati si metode,poate fi diferita de la o versiune la
alta (versiunile noi adauga functionalitati noi).
Clasa de baza pentru orice interfata Windows o reprezinta fereatra
simpla,adica un obiect de tip Form.Aceasta fereastra va functiona pe post
de suport,(container) pentru toate obiectele din interfata.
-95-
EXEMPLU:
using System;
using System.Windows.Forms;
public class AWindow : System.Windows.Forms.Form {
public AWindow(){ }
static void Main(){
Application.Run(new AWindow());
}}
Salvati fila cu numele Window1.cs si compilati.Exemplul de mai sus,
creaza o fereastra simpla de tip Form.Aceasta fereastra poate constitui
suportul pentru diverse alte operatii: se poate scrie la fel ca si in
fereastra Console,se pot desena grafice sau se pot adauga alte obiecte
si componente vizuale.
EXEMPLU:
using System;
using System.Windows.Forms;
using System.Drawing;
public partial class AWindow: System.Windows.Forms.Form{
public AWindow() { Initializeaza(); }
private void Initializeaza() {
Button1 buton1 = new Button();
buton1.Text = "OK";
buton1.Location = new Point (90,100);
buton1.Size = new Size (72,24);
buton1.Click += new EventHandler (button_Click);
this.Controls.AddRange( new Control[] { buton1 });
this.ShowDialog();
}
private void button_Click(object sender, EventArgs e) {
MessageBox.Show("Butonul meu functioneaza OK !");
}
static void Main(){
Application.Run(new AWindow());
}}
Salvati fila cu numele Window2.cs si compilati.Observati in acest
exemplu ca in constructorul ferestrei am adaugat o functie de initializare
prin care de adauga controalele necesare si un eventhandler ce gestioneaza
evenimentul OnClick al butonului buton1.Fereastra functioneaza in acest
caz pe post de container pentru toate celelalte controale auxiliare.Pentru
a include butonul in fereastra se utilizeaza metoda Controls.AddRange.
Functia de initializare contine si toate setarile si modificarile de
design dorite.Nu este esential,dar este recomandabil ca functia de
initializare ca contina un nume cat mai sugestiv,pentru a fi cat mai
usor de identificat si verificat in etapa de depanare.Daca programul este
verificat si depanat cu programe automate,acestea vor executa initial
constructorul si functiile incluse in constructor si apoi vor verifica
mediul de executie,inainte de a trece la executarea celorlate metode si
functii din program.Conventional se utilizeaza numele:
InitializeComponent()
dar se poate utiliza orice denumire sugestiva.
Butonul se poate utiliza pentru a declansa functiile programului.
-96-
Fereastra poate fi utilizata si ca suport grafic,pentru operatii de
scriere sau desen.In acest caz,in locul unei functii de initializare,se
va defini o metoda OnPaint() in care se includ operatiile dorite:
EXEMPLU:
using System;
using System.Drawing;
using System.Windows.Forms;
public class AWindow: System.Windows.Forms.Form {
public AWindow(){}
protected override void OnPaint( PaintEventArgs paintEvent)
{
Graphics g = paintEvent.Graphics;
SolidBrush brush = new SolidBrush( Color.Blue );
Pen pen = new Pen( Color.Red );
g.FillRectangle( brush, 90, 30, 150, 90 );
g.DrawLine( pen, 90, 30, 110, 40 );
g.DrawLine( pen, 90, 120, 110, 130 );
g.DrawLine( pen, 240, 30, 260, 40 );
g.DrawLine( pen, 240, 120, 260, 130 );
g.DrawRectangle( pen, 110, 40, 150, 90 );
}
static void Main(){
Application.Run(new AWindow());
}}
Salvati fila cu numele Window3.cs si compilati.Observati etapele
comune pentru orice aplicatie grafica: se creaza contextul grafic,apoi
se creaza un obiect de tip penita (pentru desen) si un obiect de tip
pensula (pentru umplerea suprafetelor) dupa care se executa operatiile
dorite,specificand coordonatele din fereastra.Atunci cand fereastra
contine atat controale vizuale,cat si reprezentari grafice,este
recomandabil sa utilizati containere de tip Panel,in care sa separati
controalele vizuale de partea grafica.In caz contrar,exista riscul de
a suprapune obiectele vizuale cu graficele,sau de a altera coordonatele
obiectelor...etc.
O situatie mai speciala,este atunci cand reprezentarile grafice se
creaza si se modifica dinamic.In acest caz,este recomandabil sa existe
o fereastra separata pentru aceste reprezentari grafice.Preferabil se
vor utiliza doua sau mai multe thread-uri,astfel incat fereastra grafica
sa poata functiona in paralel cu fereastra in care sunt incluse butoanele
de control.
O interfata grafica cu utilizatorul este formata din mai multe astfel
de obiecte vizuale,a caror functinalitate este conectata intre ele prin
metode,proprietati,sau schimb activ de date.Proiectarea unui interfete
consta din urmatoarele etape:
1. -alegerea obiectelor necesare
2. -conectarea lor functionala pentru scopul propus
3. -aranjarea obiectelor in fereastra
4. -setarea designului grafic: culori,dimensiuni,etichete...etc.
5. -testarea exceptiilor si a cazurilor extreme
6. -depanare,verificare si control
7. -testarea interfetei pentru cativa utilizatori neavizati
-97-
EXEMPLU:
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
public class AWindow: System.Windows.Forms.Form{
Button buton1;
RichTextBox text1;
public AWindow(){ Initializeaza(); }
private void Initializeaza(){
this.Size = new Size(900,700);
buton1 = new Button();
buton1.Text = "Open File";
buton1.Location = new Point (20,10);
buton1.Size = new Size(72,24);
buton1.Click += new EventHandler (button_Click);
text1 = new RichTextBox();
text1.Location = new Point(30,40);
text1.Size = new Size(850,600);
text1.Font = new Font("Verdana",12,FontStyle.Bold);
this.Controls.AddRange(new Control[] { buton1,text1});
this.ShowDialog(); }
private void button_Click(object sender, EventArgs e) {
Stream myStream = null;
OpenFileDialog fila1 = new OpenFileDialog();
fila1.InitialDirectory = "c:\\";
fila1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
fila1.FilterIndex = 2;
fila1.RestoreDirectory = true;
if (fila1.ShowDialog() == DialogResult.OK) {
try { if ((myStream = fila1.OpenFile()) != null)
{ using (myStream)
{ text1.LoadFile(fila1.Filename,RichTextBoxStreamType.PlainText); }
}}
catch (Exception ex)
{ MessageBox.Show("Nu gasesc fila.Eroare: " + ex.Message); }}}
static void Main(){ AWindow fereastra1 = new AWindow(); }
}
Salvati fila cu numele Window4.cs si compilati.In acest exemplu,pe
langa buton,se adauga un obiect de afisaj de tip RichTextBox si un
obiect de conectare de tip OpenFileDialog.La apasarea butonului se va
deschide caseta de dialog,in care utilizatorul poate alege orice fila
de tip text,pentru a fi afisata in RichTextBox.Obiectul de conectare,
are un filtru,prin care puteti limita accesul,doar la un anumit tip de
file.Exemplu: puteti arhiva in program cateva file cu extensia .xxx si
apoi setati filtrul pentru a deschide doar filele de tip .xxx.Cu un
astfel de control,utilizatorul va avea doar acces de tip Read-Only,la
un anumit subset de file,alese de programator.
Multe aplicatii executa si operatii cu date calendaristice.Pentru a
afisa data curenta,sau o data oarecare,exista clasa DateTimePicker.
-98-
EXEMPLU:
using System;
using System.Windows.Forms;
public class AWindow: System.Windows.Forms.Form {
public AWindow(){
DateTimePicker data1 = new DateTimePicker();
data1.MinDate = new DateTime(1900,1,1);
data1.MaxDate = DateTime.Today;
data1.CustomFormat = "MMMM dd,yyyy - dddd";
data1.Format = DateTimePickerFormat.Custom;
data1.ShowCheckBox = true;
data1.ShowUpDown = true;
Controls.Add(data1);
this.ShowDialog();
}
static void Main(){ AWindow a1 = new AWindow(); }
}
Salvati fila cu numele Window5.cs si compilati.Cu un astfel de
control,utilizatorul poate alege o data oarecare,din intervalul setat
intre MinDate si MaxDate.Apoi,data respectiva poate fi preluata si
procesata pentru a produce rezultatele dorite.
Unele controale pot contabiliza operatiile din interfata:
EXEMPLU:
using System;
using System.Windows.Forms;
public class Form1 : Form {
public static void Main() { Application.Run(new Form1()); }
private Button button1;
private ListBox listBox1;
public Form1() {
button1 = new Button();
button1.Left = 200;
button1.Text = "Exit";
button1.Click += new EventHandler(button1_Click);
listBox1 = new ListBox();
this.Controls.Add(button1);
this.Controls.Add(listBox1);
}
private void button1_Click(object sender,System.EventArgs e)
{ int count = 1;
while ( MessageBox.Show("Exit ?","",
MessageBoxButtons.YesNo) == DialogResult.No)
{ listBox1.Items.Add(count); count += 1; }
Application.Exit();
}}
Salvati fila cu numele Window6.cs si compilati.La fiecare selectie
a butonului No,caseta ListBox va inregistra o noua operatie.Observati
modul in care a fost implementata conditia optionala pentru fereastra
MessageBox.Intreaga functionalitate a interfetei este conectata prin
aceasta bucla while().
-99-
Exista si situatii in care doriti ca aplicatia sa deschida in paralel
doua,sau mai multe ferestre simultan.Solutia este sa includeti toate
ferestrele intr-un obiect de tip Application si sa utilizati thread-uri
diferite pentru fiecare fereastra.
EXEMPLU:
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
public class AWindow : System.Windows.Forms.Form {
public AWindow(){ this.BackColor = Color.Red; } }
public class AWindow2 : System.Windows.Forms.Form {
public AWindow2(){ this.BackColor = Color.Blue; } }
class Aplicatie {
public void F1(){ Application.Run(new AWindow()); }
public void F2(){ Application.Run(new AWindow2()); }
static void Main() {
Aplicatie a1 = new Aplicatie();
Thread t1 = new Thread(a1.F1);
Thread t2 = new Thread(a1.F2);
Dostları ilə paylaş: |