Nivel de cunoastere: Incepator
Probabil ca ati auzit termenul de “assembly” de foarte mule ori in documentatia .NET. In acest articol va voi impartasi cateva lucruri despre assembly-urile .NET.
Ce este acela un “assembly”?
· Un assembly este o unitate logica de cod
· Assembly-urile exista fizic sub forma de DLL-uri sau EXE-uri
· Un assembly poate contine unul sau mai multe fisiere
· Fisiere inglobate intr-un assembly pot fi de diverse tipuri ca imagini, fisiere text etc impreuna cu DLL-uri si EXE-uri
· Cand compilam codul sursa, implicit DLL-ul/EXE-ul generat este de fapt un assembly
· Daca sursele nu sunt impachetate sub forma de assembly, atunci acestea nu mai pot fi folosite in alte aplicatii
· Cand vorbim despre versiunea unei componente, vorbim de fapt de versiunea assembly-ului de care apartine componenta
· Orice assembly contine intormatii despre el. Aceste informatii poarta numele de Assembly Manifest.
Ce este “assembly manifest”?
· Assembly Manifest este o structura de date care stocheaza informatii despre un assembly
· Aceste informatii sunt stocate in fisieruaha
· l assembly (DLL/EXE)
· Informatiile includ date despre versiune, lista fisierelor constituent etc
Ce este assembly-ul privat si cel comun ?
Assembly-ul care este folosit de o singura aplicatie poarta numele de assembly privat. Presupunand ca am creat un DLL care inglobeaza logica dumneavoastra de business. Acest DLL va fi folosit doar de aplicatia client si nu si de alta aplicatie. Prin urmare assembly-ul este privat aplicatiei dumneavoastra.
Presupunand acum crearea unui DLL cu scop general care furnizeaza functionalitati care vor fi folosite de o varietate de aplicatii. Acum, in loc ca orice aplicatie client sa aiba propria copie a DLL-ului, putem pune DLL-ul in ‘global assembly cache’. Asemenea assembly-uri poarta denumirea de assembly-uri share-uite/comune.
Ce este ‘Global Assembly Cache’?
‘Global Assembly Cache’ nu este altceva decat un director special pe disc unde sunt tinute toate assembly-urile commune. Acest director este <drive>:\<Windows dir>\Assembly.
Cum evita assembly-urile fenomenul de “DLL Hell”?
Cum am precizat mai devreme majoritatea assembly-urilor sunt private. Deci cum fiecare aplicatie client referee assembly-uri din propriul director de instalare, chiar daca exista mai multe versiuni ale aceluiasi assembly nu va exista nici un conflict intre acestea. Sa consideram acum urmatorul exemplu:
· Am creat assembly-ul Assembly1
· Am creat si o aplicatie client: Client1 care foloseste Assembly1
· Am instalat clinetul in directorul C:\MyApp1 si ap pus si Assembly1 in acest director
· Dupa ceva timp am modificat Assembly1
· Acum am creat o alta aplicatie Client2 care foloseste assembly-ul Assembly1 modificat
· Am instalat Client2 in directorul C:\MyApp2 si am pus si Assembly1 modificat in acest director
· De vreme ce ambii client refera propriile versiuni ale Assembly1 totul functioneaza fara probleme
Acum sa ne imaginam cazul in care am dezvoltat un assembly care este comun. In acest caz este important sa stim cum sunt verionate assembly-urile. Toate assembly-urile au un numar de versiune sub forma:
major.minor.build.revision
Daca modificam assembly-ul original, versiunea modificata va fi considerata compatibila cu cea existenta daca versiunile de major si minor coincid. Cand aplicatia client cere assembly-ul, numarul versiunii cerute este comparat cu versiunile disponibile si este livrata acea versiune care are acelasi major si minor si care are cel mai nou build si revision.
Cum creez assembly-uri comune?
Urmatorii pasi sunt implicati in crearea unui assembly comun:
· Scriem codul sursa pentru DLL-ul/EXE-ul nostru
· Generam numele de assembly unic folosind utilitarul SN
· Inregistram DLL-ul/EXE-ul cu cheia privata modificad fisierul de AssemblyInfo
· Punem DLL-ul/EXE-ul rezultat in Global Assembly Cache folosind utilitarul AL
Microsoft foloseste acum o pereche de chei de tip public – privat pentru a identifica in mod unic un assembly. Aceste chei sunt generate folosind un utilitar numit SN.exe (SN provine de la Shared Name – Nume Comun) . Cea mai comuna sintaxa este:
sn -k mykeyfile.key
unde k reprezinta ca vrem sa generam o cheie si un numele de fisier care urmeaza este fisierul in care cheile generate vor fi stocate.
Inainte sa punem assembly-urile in Global Assembly Cache trebuie sa le inregistram cu cheile care doar le-am generat. Punem aceste informatii intr-un fisier special numit AssemblyInfo. Deschidem fisierul din VS.NET si il modificam astfel incat sa includa linia:
[assembly:AssemblyKeyFile("file_path")]
Acum recompilam proiectul si assembly-ul va fi inregistrat.
Microsoft ne furnizeaza un utilitar numit AL.exe pentru a pune assembly-ul in cache-ul comun.
AL /i:my_dll.dll
Acum DLL-ul nostru va fi plasat de utilitarul AL in locatia corespunzatoare.
Introducere in assembly-uri Metin Gemil.docx (21.11 kb)