namespace FunctiileMele
{
public class Adunare
{
public static long Add(long i,long j)
{
return(i+j);
}
}
}
Salvati fila cu numele Adunare.cs.
pentru o operatie de inmultire,editati un modul de genul:
using System;
namespace FunctiileMele {
public class Inmultire {
public static long Multiply(long x,long y) { return (x*y); }
}
}
Salvati fila cu numele Produs.cs.Observati ca ambele file declara si
un spatiu denumit (namespace) ce va fi utilizat ca identificator.
-7-
In continuare,cele doua functii pot fi incluse intr-o fila DLL cu o
astfel de comanda:
csc /target:library /out:FunctiileMele.DLL Adunare.cs Produs.cs
Observati ca in directorul curent a fost asamblata fila:
FunctiileMele.DLL 0.0.0.0
In continuare,aceasta biblioteca va putea fi apelata la fel ca orice
alta biblioteca DLL.Sa presupunem ca doriti sa scrieti un mic modul,in
care se aplica ambele functii,pentru doi parametri inclusi in linia de
comanda.Editati un program de genul:
using System;
using FunctiileMele;
class Operatie1 {
public static void Main( string[] args) {
if (args.Length != 2) {
Console.WriteLine("Comanda este: Operatie1 ");
return;
}
long num1 = long.Parse(args[0]);
long num2 = long.Parse(args[1]);
long sum = Adunare.Add(num1,num2);
long product = Inmultire.Multiply(num1,num2);
Console.WriteLine("Suma dintre {0} si {1} este {2}",
num1,num2,sum);
Console.WriteLine("Produsul dintre {0} si {1} este {2}",
num1,num2,product);
}
}
Salvati fila cu numele Operatie1.cs.Pentru a produce un executabil se
va include in linia de comanda si resursa DLL utilizata,astfel:
csc /out:Operatie1.exe /reference:FunctiileMele.DLL Operatie1.cs
In continuare,executabilul Operatie1.exe,poate fi utilizat direct cu
o linie de comanda,in care se introduc si valorile ce urmeaza sa fie
calculate.
Exemplu: pentru numerele 111 si 22222 se va utiliza o comanda:
Operatie1 111 22222
Programul va returna mesajele:
Suma dintre 111 si 22222 este 22333
Produsul dintre 111 si 22222 este 2466642
Asadar compilatorul csc.exe poate produce atat executabile cat si
biblioteci DLL,in functie de optiunile din linia de comanda.Pentru a
vedea toate optiunile posibile,puteti edita o comanda de genul:
csc.exe / ? sau csc.exe / help
Acest manual nu va analiza decat succint optiunile de compilare,asa
ca este recomandabil sa studiati referinta MSDN si sa analizati cu
maximum de atentie posibilitatile oferite de compilator.O mare parte
dintre optiuni nu sunt accesibile din interfata Visual C# si nu pot fi
apelate decat cu ajutorul unei linii de comanda.
O linie de comanda poate sa includa o singura optiune,sau o combinatie
de optiuni,in functie de rezultatul scontat.Puteti copia soltii de
compilare,din manuale si tutoriale,dar este preferabil sa analizati si sa
intelegeti continutul unei astfel de comenzi.
-8-
PRINCIPALELE OPTIUNI DE COMPILARE SUNT:
/filealign:number -permite specificarea dimensiunii,pentru fiecare
sectiune din fila produsa.Valorile acceptabile pentru number sunt:
512,1024,2048,4096 si 8192 si reprezinta bytes.Alegerea unei anumite
dimensiuni poate fi esentiala atunci cand aplicatia va fi rulata pe
unitati mici (exemplu: telefon celular).
/optimize[+ sau -] -permite utilizarea unor mecanisme de optimizare a
modulului creat,pentru a fi mai mic,mai rapid,mai eficient.In mod
implicit,compilatorul va utiliza optiunea /optimize-.Se poate combina
cu optiunea /debug.
/doc:file -permite colectarea tuturor comentariilor din cod,pentru a forma
o fila de tip XML (o fila de documentare).Daca fila XML creata are
acelasi nume ca si fila de asamblare din care a fost extrasa si este
amplasata in acelasi director,va putea fi utilizata cu utilitarul
"intelisense",pentru a facilita munca programatorilor Visual C#.
EXEMPLU: csc XMLsample.cs /doc:XMLsample.xml
/out:filename - permite specificarea unui nume pentru fila creata.Daca se
omite fila executabila va avea acelasi nume ca si fila sursa,iar in
cazul filelor DLL si NETMODULE va avea acelasi nume ca si prima fila
din lista filelor sursa.Optiunea se poate utiliza pentru a crea
simultan atat o fila .exe cat si un modul:
EXEMPLU: csc test.cs /out:modul1.netmodule /target:module t2.cs
/target -este optiunea prin care se poate specifica tipul de fila creata.
Are urmatoarele variante:
/target:exe - creaza un executabil de tip consola
/target:library - creaza o biblioteca DLL
/target:module - creaza un modul
/taget:winexe - creaza un program de tip Windows
Daca se creaza simultan mai multe file si module,manifestul va fi
amplasat in prima dintre ele.
EXEMPLU: csc /out:1.exe t1.cs /out:2.netmodule t2.cs
In exemplul de mai sus,manifestul va fi inclus in fila 1.exe.
Nu se pot crea simultan mai multe executabile sau biblioteci DLL.
Daca prima fila este .exe sau .dll,urmatoarele nu pot fi decat
module.Modulele nu sunt considerate a fi asamblari si nu pot contine
manifestul.Pentru a specifica daca fila este CLS complianta se poate
adauga si atributul CLSCompliant.
EXEMPLU:
csc /target:exe test.cs[assembly:System.CLSCompliant(true)]
Daca se omite optiunea /target,se va utiliza implicit /target:exe
Daca fila executabila se construieste din mai multe file,este
suficient ca una dintre ele sa contina functia Main.In acest caz,
se poate utiliza optiunea /main pentru a specifica fila ce contine
functia Main.Pentru filele DLL,functia Main nu este esentiala.Daca
nu se specifica altfel prin /out,biblioteca DLL va purta acelasi
nume ca si fila sursa.
EXEMPLU: csc /target:library test.cs va crea fila test.dll
Varianta target:module permite crearea unei file fara manifest.O
astfel de fila nu poate fi executata,dar poate fi inclusa in alta
asamblare cu ajutorul optiunii /addmodule.
-9-
Cu alte cuvinte,modulele se pot utiliza in lista de file sursa,
pentru a crea executabile noi.
Varianta /target:winexe creaza executabile de tip Windows.Si
acestea vor avea tot extensia .exe,dar vor avea o interfata atat
pentru platforma .Net Framework cat si pentru Win32 API.
EXEMPLU: csc /target:winexe test.cs
va crea un program de tip Windows.
/addmodule:file[;file2] -este optiunea prin care se pot include in etapa
de asamblare si module create anterior cu /target:module.Nu se
pot include file complete ce contin si manifestul.Pentru a
include simultan mai multe module,se poate utiliza virgula sau
punct si virgula intre module.Toate modulele utilizate la
constructie trebuie sa insoteasca fila executabila in momentul
executiei (sa fie in acelasi director cu fila executabila),la
fel ca orice alta fila de resurse.
EXEMPLU: csc/addmodule:metad1.netmodule /out:Program1.exe test.cs
In exemplul de mai sus,compilatorul va adauga la asamblare si
modulul meta1.netmodule,pe langa fila sursa test.cs
/lib - permite specificarea unui director,sau a unei liste de directoare,
in care compilatorul va cauta preferential o resursa,atunci cand
nu este in acelasi director cu compilatorul.
EXEMPLU: csc /lib:c:\ /reference:t2.dll t2.cs
In exemplul de mai sus,pentru a construi executabilul,compilatorul
va cauta fila t2.dll in directorul curent,sau in directorul C:\
/nostdlib[+ sau -] - permite sau blocheaza importul automat al bibliotecii
mscorlib.dll (cea care defineste System namespace).Implicit,se va
utiliza optiunea /nostlib+.Are rost sa specificati /nostlib-,doar
atunci cand doriti sa creati un System namespace propriu si
aplicatia urmeaza sa fie executata in mediu minim de memorie.
/reference:file[;file2] - se utilizeaza pentru a importa una sau mai
multe biblioteci DLL,necesare pentru compilare.Daca sunt mai
multe,se vor specifica sub forma de lista,separate prin punct si
virgula.Optiunea se poate scrie prescurtat si /r.
EXEMPLU: csc /r:meta1.dll;meta2.dll /out: Program.exe test.cs
In exemplul de mai sus,bibliotecile meta1 si meta2 se vor compila
impreuna cu fila sursa test.cs pentru a produce fila Program.exe.
/bugreport:file -permite crearea unei file de depanare,in care se vor
edita automat urmatoarele date:
-o copie a tuturor filelor sursa
-o lista cu optiunile de compilare
-informatii despre versiunea compilatorului,sistemul de operare si
mediul de executie.
-o lista a bibliotecilor DLL si a modulelor utilizate,altele decat
cele din suportul .NET.
-datele produse de compilator (daca exista)
-o scurta descriere a problemei (editata de utilizator)
-o scurta propunere de remediere (editata de utilizator)
EXEMPLU: csc /bugreport:problema.txt Test.cs
In exemplul de mai sus,se va crea automat fila problema.txt in
care se vor arhiva toate elementele amintite mai sus.Puteti apoi
expedia aceasta fila la compania Microsoft.
-10-
/checked[+ sau -] -verifica daca valorile aritmetice de tip integer sunt
sau nu sunt cuprinse in domeniul de valori (Overfolw/underflow).
Daca optiunea este checked+ si o valoare este situata in afara
domeniului,se va genera o eroare de executie.Daca se compileaza
codul cu optiunea checked-,instructiunea nu va genera o eroare de
executie,chiar daca exista valori INT in afara domeniului.
/debug[+ sau -] si /debug:{full sau pdbonly} -se utilizeaza pentru a
genera o fila in format .pdb (program database) in care se vor
arhiva informatii utile pentru depanare.Implicit este /debug-.
Daca se utilizeaza /debug+ se poate alege una dintre variantele
full sau pdbonly (implicit este full).
EXEMPLU: csc /debug test.cs.
/fullpaths -in mod implicit,daca exista erori,compilatorul specifica fila
in care a intervenit eroarea.Daca se utilizeaza optiunea /fullpaths,
compilatorul va indica si calea completa de acces la fila in care a
intervenit eroarea.
/warn:option -permite alegerea nivelului de avertismente emise de catre
compilator.Pentru option se pot utiliza urmatoarele valori:
0 -blocheaza toate mesajele de avertizare
1 -afiseaza doar avertismentele foarte severe
2 -afiseaza nivelul 1 de avertismente si unele mai putin severe
3 -afiseaza nivelul 2 de avertismente plus avertismente banale
4 -afiseaza tot setul de avertismente.Este optiunea implicita.
EXEMPLU: csc /warn:1 test.cs
/warnaserror[+ sau -] -trateaza toate avertismentele ca pe niste erori de
compilare si blocheaza asamblarea filei solicitate,pana dupa ce se
remediaza toate aceste erori.Implicit se utilizeaza: warnaserror-.
/define:name[;name2] -este echivalentul unei directive de preprocesare
definita prin #define.Se utilizeaza pentru a defini simbolurile
specificate prin "name" in etapa de preprocesare a codului.Acestea
vor ramane definite pana la o comanda #undefine.Se pot utiliza si
bucle conditionale: #if,#else,#elif si #endif.Se poate utiliza si
varianta prescurtata /d.Daca se definesc mai multe simboluri,acestea
se vor separa prin virgula sau punct si virgula.
EXEMPLU: editati urmatoarea fila test.cs:
using System;
public class Test {
public static void Main(){
#if (xx)
Console.WriteLine("xx exista");
#else
Console.WriteLine("xx nu exista");
#endif
Console.ReadLine();
}}
Compilati fila cu: csc /define:xx test.cs si apoi cu
csc test.cs si observati diferenta.
Directivele de precompilare se pot utiliza atunci cand doriti sa
blocati compilarea unor fragmente de cod.Exemplu: doriti sa puteti
produce versiuni diferite ale programului: o versiune trunchiata si
o versiune completa.
-11-
/linkresource:filename[,identifier] - creaza un link spre una dintre
resursele suportului .NET.Fila de resurse nu va fi amplasata in
fila de output (se creaza doar link-ul).Pentru a include fila se
poate utiliza optiunea /resource.Nu se poate utiliza pentru module.
Prin "filename" se specifica resursa,iar prin "identifier" se va
specifica numele resursei utilizat pentru import(de obicei numele
filei ce contine resursa).
EXEMPLU: csc /linkresource:rf.resource test.cs
/resource:filename[,identifier] -se utilizeaza pentru a ingloba o fila de
resurse in fila asamblata.Prin "filename" se specifica resursa,iar
prin "identifier" numele resursei (numele filei ce contine resursa).
EXEMPLU: csc /resource:rf.resource test.cs
/win32icon:filename -se utilizeaza pentru a include o fila de tip icon in
fila asamblata,astfel incat executabilul sa fie afisat pe ecran cu
aspectul dorit.Fila tip .ico poate fi creata si dintr-o fila .rc
cu Resource Compiler (dar mai simplu se creaza in Paint).
EXEMPLU: csc /win32icon:rf.ico test.cs
/win32res:filename - se utilizeaza pentru a insera o rsursa de tip Win32
in fila de asamblare.Fila de resurse .res poate fi creata si din
fila .rc cu Resource Compiler.
EXEMPLU: csc /win32res:rf.res test.cs
@file_name -se utilizeaza pentru a prelua comanda de compilare dintr-o
fila cu extensia .rsp.Se utilizeaza atunci cand asamblati frecvent
file cu o comanda de compilare mai complexa.Eventual se pot utiliza
doua sau mai multe astfel de file sursa,specificate fiecare separat:
@fila1.rsp @fila2.rsp ..etc.
EXEMPLU: -deschideti Notepad si editati textul:
/target:exe test.cs
salvati fila cu numele "fila1.rsp" (cu numele intre
ghilimele-altfel se va salva cu extensia .txt).Apoi puteti utiliza
fila cu o comanda: csc @fila1.rsc
/help si /? -se utilizeza pentru a lista optiunile de compilare si o
scurta descriere a lor.Nu se asambleaza nici o fila.Este doar pentru
o orientare rapida,inainte de compilare.
Exemplu: csc /? sau csc /help
/baseaddress:address -se utilizeaza pentru a specifica o adresa de baza
preferata,pentru importul unei file .DLL.Adresa se poate specifica
sub forma de numar zecimal,octal sau hexazecimal.La import,adresa
va fi rotunjita (Exemplu: 0x11110001 devine 0x11110000).
/codepage:id -se utilizeaza atunci cand fila de cod compilata utilizeza
un alt set de caractere decat cel instalat in sistemul de operare
si altul decat UTF-8.
/incremental[+ sau -] -se utilizeaza atunci cand doriti sa compilati
doar actualizarile unei file.Pentru acest scop,trebuie activata
compilarea incrementala.Prima data cind utilizati optiunea
/incremental,se va crea o fila .incr in care se salveaza informatii
despre statusul compilarii,altele decat cele arhivate in fila de
debug .pdb.Daca schimbati optiunile de compilare cu o noua optiune
/incremental,fiele .incr si .pdb vor fi actualizate automat.La o
astfel de compilare,optiunea /doc este ignorata.Este utila atunci
cand asamblarea se face din foarte multe file mici.
-12-
/main:class -se utilizeaza atunci cand codul sursa contine mai multe
clase in care este definita o functie Main(),pentru a specifica
explicit care este functia Main() din care incepe executia
programului (functia controller).
EXEMPLU: csc t2.cs t3.cs /main:Test2
In exemplul de mai sus,functia Main() de lansare a programului va
fi cea definita in clasa Test2.
/noconfig -se utilizeaza pentru a instrui compilatorul sa ignore fila
csc.rsp.
/nologo -se utilizeaza pentru a impideca afisarea unui banner in timp ce
se executa compilarea.
/recurse:[dir\]file - se utilizeaza pentru a putea compila si file sursa
localizate la alta adresa decat in directorul curent.Prin "dir" se
specifica directorul,iar prin "file" fila sau filele sursa.Se pot
utiliza si caractere generale,pentru a selecta toate fielele ce
corespund unui anumit pattern (Exemplu: csc *.cs).
EXEMPLU:
csc /target:library /out:bib1.DLL /recurse: dir1\dir2\*.cs
In exemplul de mai sus,se vor compila toate filele din directorul
dir2,arhivat in dir1,pentru a forma fila: bib1.DLL.
/unsafe -se utilizeaza pentru a permite compilarea si atunci cand exista
coduri marcate ca nesigure.
EXEMPLU: csc /unsafe test.cs
/utf8output -se utilizeaza pentru ca fila de output sa fie codificata in
caractere de tip UTF8.
Acestea sunt principalele optiuni,pentru compilatorul C sharp din
versiunea v3.5 a suportului .Net.Practic,nu exista un singur compilator,
ci fiecare versiune de program are compilatorul sau,iar programele
Visual C# au un compilator diferit.Pot exista diferente semnificative
intre versiuni (majoritatea nu pot fi executate din Visual C#).Este bine
sa verificati cel putin succint ce optiuni sunt incluse in versiunea
d-voastra (cu csc /help).
Exista si un utilitar ce permite dezasamblarea partiala a tuturor
filelor asamblate cu csc.Acest utilitar poarta numele de "idlasm.exe" si
este livrat impreuna cu sistemul de operare,in directorul Microsoft SDKs
(din Program Files).Pentru a descompune un executabil sau o biblioteca
DLL,lansati programul cu un dublu click,apoi utilizati meniul File,pentru
a deschide fila dorita.Exemplu: deschideti fila StartNotepad.exe creata
in primul exemplu din acest manual.Se va deschide continutul filei sub
forma de arbore binar.Puteti observa manifestul si clasa WelcomeCSS.
Daca executati un dublu click pe obiectele din diagrama,se va afisa
continutul obiectului respectiv,in limbaj intermediar.Din meniul View,
puteti selecta o serie de optiuni de afisare.Acest utilitar nu poate
fi utilizat pentru a extrage codurile sursa din fila de asamblare,dar
poate oferii o imagine de ansamblu a spatiilor namespace,a claselor si
metodelor,a proprietatilor si a evenimentelor din program etc.Se poate
utiliza si pentru o inspectie rapida a claselor si metodelor arhivate in
bibliotecile suportului .NET,arhivate la adresa:
C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5
De exemplu,deschideti si explorati fila: System.Core.dll.
-13-
TIPURI DE DATA
Prima aplicatie pentru orice limbaj de programare o reprezinta un
calcul numeric simplu.Primele programe pentru calculator,au fost exclusiv
programe de calcul numeric.Tot din acea perioada,dateaza si formatele
numerice simple: integer,signed si unsigned precum si stivele (stramosii
ariilor de date).Pentru a pastra compatibilitatea cu programele vechi,
majoritatea programelor noi,au pastrat si aceste tipuri de date,chiar
daca utilitatea lor este din ce in ce mai redusa.Pot fi utile,mai ales
in cadrul unor rutine de automatizare,concepute sa opereze in mediu foarte
limitat de memorie.
Limbajul C# recunoaste doua tipuri fundamentale de date : tip valoric
si tip referinta.Tipurile de data valorice pot fi elementare (int,char,
float etc) sau enumerari si structuri.Tipurile referinta (pointerii) pot
fi clase,interfete,clase delegat sau arii de date.In limbaj C# tipurile
predefinite de data sunt membrii ai clasei System,si se importa in
program o data cu biblioteca System.Tipurile valorice contin datele
propriu-zise,in timp ce referintele contin doar un pointer spre adresa
de memorie la care sunt arhivate datele.Este posibil sa existe mai multe
referinte spre aceeasi adresa de memorie.Actualizand datele de la o
astfel de adresa,se vor actualiza automat toate referintele spre acea
adresa.Prin contrast,actualizarea unui tip de data valoric nu poate
modifica nici o alta data din program (data este arhivata in acel tip).
Pentru a facilita munca programatorilor,C# ofera un set destul de
bogat de tipuri predefinite.Toate aceste tipuri predefinite sunt obiecte
si sunt declarate in biblioteca System (Exemple: System.Int16,System.Byte)
iar pentru a simplifica manevrarea lor,au si cate o denumire alias:
-------------------------------------------------------------------------
| Nume | Tip CTS | Descriere | Domeniu de valori |
--------------------------------------------------------------------------
| sbyte | System.SByte | 8-bit signed integer | -128 la 127 |
| short | System.Int16 | 16-bit signed integer | -32768 la 32767 |
| int | System.Int32 | 32-bit signed integer | -2 E31 la 2 E31 |
| long | System.Int64 | 64-bit signed integer | -2 E63 la 3 E63 |
| byte | System.Byte | 8-bit unsigend integer| 0 la 255 |
| ushort | System.UInt16 |16-bit unsigned integer| 0 la 65535 |
| uint | System.UInt32 |32-bit unsigned integer| 0 la 2 E32 (-1) |
| ulong | System.UInt64 |64-bit unsigned integer| 0 la 2 E64 (-1) |
--------------------------------------------------------------------------
| float | System.Single |32-bit single precision| 10 E-45 la 10 E38 |
| double | System.Double |64-bit double precision|10 E-324 la 10E308 |
--------------------------------------------------------------------------
| decimal | System.Decimal |128-bit high precision | 10 E-28 la 10 E28 |
--------------------------------------------------------------------------
| bool | System.Boolean | | true sau false |
--------------------------------------------------------------------------
| char | System.Char |16-bit single character|Unicode character |
--------------------------------------------------------------------------
| object | System.Object | tipul de baza CTS | tipurile derivate|
--------------------------------------------------------------------------
| string | System.String | unicode cahar. string | textul inclus |
--------------------------------------------------------------------------
-14-
Se pot utiliza ambele tipuri de notatii,dar se recomanda utilizarea
notatiilor alias (int,bool,string etc.).
Tipurile de data nu pot fi utilizate ca atare,ci se creaza variabile
sau constante din tipul respectiv.Toate aceste variabile si constante
vor fi de fapt niste obiecte,avand ca ancestor obiectul radacina:
System.Object.Prin acest mecanism,toate datele analizate de compilator
vor fi de tip obiect,adica vor fi incapsulate intr-un spatiu de memorie
denumit (namespace),pentru a evita datele defective rezultate prin
suprascrierea uni tampon de memorie cu valori mai mari decat domeniul
maxim.Daca valorile atribuite nu sunt corecte,obiectul nu se creaza si
se evita astfel aparitia unor date cu format incorect,ce nu pot fi
sterse si paraziteaza inutil memoria.In plus,structurarea sub forma de
obiecte,simplifica mecanismul automat de eliberare a memoriei (garbage
collector).
Dostları ilə paylaş: |