Asamblări C #

Ansamblul este un singur fișier Portable Executable (PE) cu extensia .exe în cazul unei aplicații sau .dll în cazul unei biblioteci reutilizabile.







Conținutul ansamblului

  • Manifestul de asamblare conține informații pentru timpul de rulare .NET: numele de asamblare, versiunea, drepturile de acces necesare, legăturile cu alte ansambluri.
  • Manifest de aplicații - conține informații despre sistemul de operare: modul în care este instalat ansamblul, nevoia de privilegii de administrator.
  • Tipurile compilate sunt codul IL compilat și metadatele tipurilor incluse în ansamblu.
  • Resurse - alte date incluse în ansamblu: imagini, texte localizate.

Este obligatoriu numai de asamblare manifestă (deși tipuri conține, de obicei compilate. Fișiere executabile și biblioteci au aceeași structură, principala diferență este faptul că fișierele executabile conțin punctul de intrare.

Adunarea manifestă

Manifestul de adunare trebuie să conțină:

  • nume simplu de asamblare
  • numărul versiunii (AssemblyVersion)
  • cheia publică și hash-ul semnat al adunării, dacă are un nume strict
  • lista ansamblurilor (inclusiv versiunile și cheile publice)
  • lista modulelor de asamblare
  • O listă de tipuri definite în ansamblu și module care conțin fiecare tip
  • Un set opțional de drepturi de acces necesare sau refuzate de către asamblare (SecurityPermission)
  • cultura țintă dacă este o adunare subordonată (AssemblyCulture)

De asemenea, manifestul de asamblare poate conține:

Unele dintre aceste date provin din parametrii parcurși de compilatori. Restul sunt luate din atributele de asamblare (indicate în paranteze):

Conținutul ansamblului este ambalat într-unul sau mai multe containere, numite module. Modulul corespunde unui fișier de asamblare și face posibilă crearea de ansambluri compuse din mai multe fișiere. Într-un ansamblu multiplu, modulul principal conține întotdeauna un manifest, iar modulele suplimentare pot conține cod și / sau resurse. Manifestul descrie locația relativă a tuturor modulelor de asamblare.

Clasă de asamblare

Clasa System.Reflection.Assembly vă permite să accesați metadatele de construire în timpul rulării. Puteți obține un obiect de asamblare în mai multe moduri:

  • utilizând proprietatea Assembly a clasei Type:
  • folosind metode statice ale clasei Adunării:
    • GetExecutingAssembly - returnează un ansamblu care conține funcția executabilă (metoda)
    • GetCallingAssembly - returnează un ansamblu care conține funcția numită funcția executabilă curentă
    • GetEntryAssembly - returnează un ansamblu care conține punctul de intrare în aplicație
  • Când primiți obiectul Adunării folosind metodele și proprietățile sale, puteți obține metadatele de asamblare și puteți efectua reflectarea tipurilor sale.

    Membrii clasei Adunării:

    • FULLNAME. GetName - returnează un nume complet calificat sau obiect AssemblyName
    • CodeBase. Locație - locația fișierului de asamblare
    • Load. LoadFrom. LoadFile - Încarcă manual ansamblul în domeniul aplicației curente
    • GlobalAssemblyCache - indică dacă ansamblul este în GAC
    • GetSatelliteAssembly - găsește un ansamblu subordonat cu o anumită cultură
    • Gettype. GetTypes - returnează tipul sau toate tipurile definite în ansamblu
    • EntryPoint - returnează metoda punctului de intrare în aplicație ca obiect MethodInfo
    • GetModules. ManifestModule - returnează toate modulele sau modulul principal de asamblare
    • GetCustomAttributes - returnează atributele ansamblului

    Nume de asamblare

    Identificatorul de montaj constă din patru părți:

    • nume simplu
    • versiune ("0.0.0.0" dacă nu este specificată)
    • cultura ("neutră" pentru ansamblurile ne-subordonate)
    • simbolul cheii publice ("null" dacă ansamblul nu are un nume strict)






    Un nume simplu este luat din numele fișierului în care ansamblul a fost compilat inițial. Extensia este eliminată, de exemplu, un nume simplu pentru ansamblul System.Xml.dll arată ca System.Xml. Redenumirea unui fișier nu modifică numele simplu al ansamblului.

    Numărul versiunii este preluat din atributul AssemblyVersion și reprezintă o linie împărțită în 4 părți:

    void SetPublicKeyToken (byte [] publicKeyToken);

    Proprietatea Versiune returnează un obiect Versiune. care în sine are proprietățile lui Major. Minor. Construcție și revizuire. Deoarece versiunea de asamblare este setată de atributul AssemblyVersion. face parte din numele ansamblului, modificarea sa în unele cazuri nu este de dorit. În plus față de atributul AssemblyVersion, există două alte atribute care specifică versiunea, dar care sunt pur informative și nu sunt luate în considerare de CLR:

    • AssemblyInformationalVersion - versiune de informații - specifică versiunea afișată utilizatorului final. Este vizibilă în caseta de dialog Proprietăți fișier din câmpul Versiune produs. Poate fi orice linie, de exemplu, 5.1 Beta 2. De obicei, toate ansamblurile din aplicație au aceeași versiune de informație.
    • AssemblyFileVersion - versiunea de fișier - se referă la numărul de construcție al ansamblului. Acesta este afișat în caseta de dialog Proprietăți fișier din câmpul Versiune fișier. Ca și AdunareaVersion, trebuie să aveți o linie împărțită în 4 părți.

    Numele puternic

    Denumirile stricte ajută la protejarea asamblării de fals. Un ansamblu strict numit are un identificator unic și non-forjat, care se obține prin adăugarea următoarelor metadate la manifestul de asamblare:

    Pentru a atribui un nume puternic ansamblului, trebuie să generați mai întâi un fișier cu o pereche de taste, de exemplu, utilizând utilitarul sn.exe. Utilitarul va crea un fișier cu extensia .snk care conține perechea de chei. Apoi ansamblul trebuie să fie compilat cu parametrul / keyfile:

    Clasa Publisher în spațiul de nume System.Security.Policy conține proprietatea Certificate. Dacă această proprietate returnează o valoare diferită de nulă, atunci ansamblul este semnat de sistemul Authenticode.

    Semnătura Authenticode nu face parte din numele ansamblului.

    GAC - cache global de asamblare (Global Cache Assembly)

    Când instalați .NET Framework, creați un depozit centralizat de asamblare pe computer - Global Cache Assembly (GAC). GAC conține ansamblurile platformei .NET Framework în sine și puteți adăuga, de asemenea, propriile dvs. adunări. Caracteristica principală a GAC ​​este suportul versiunii centralizate (este gestionat de administrator la nivelul mașinii). Dacă acest sprijin este într-adevăr necesar, puteți adăuga ansambluri la GAC, în toate celelalte cazuri acest lucru va complica doar dezvoltarea. implementarea și susținerea aplicației.

    Pentru a instala ansamblul în GAC, mai întâi trebuie să specificați un nume strict. După aceasta, îl puteți adăuga la GAC ​​folosind utilitarul gacutil:

    Instalarea ansamblurilor în GAC poate fi definită ca parte a proiectului de instalare în Visual Studio.

    După încărcarea ansamblului în GAC, aplicațiile îl pot trimite fără a fi nevoie de o copie locală. Cu toate acestea, dacă este prezentă o copie locală, va fi ignorată în favoarea asamblării de la GAC.

    Asamblarea în plus față de codul sursă poate conține resurse: text, imagini și fișiere XML. De obicei, imaginile sau datele localizabile sunt adăugate la ansamblu ca resurse. Resursa de asamblare este în final un flux de octeți numit. Asamblarea le stochează în dicționare cu chei de șir.

    Conținutul localizat este mai întâi adăugat la fișierele .resources. Atunci când sunt compilate, acestea sunt ambalate ca ansambluri subordonate individuale care sunt selectate automat la timpul de execuție pe baza limbajului OS.

    Încorporarea directă a resurselor

    Pentru a încorpora o resursă direct într-un ansamblu, trebuie să o compilați cu una sau mai multe din următoarele opțiuni de resurse:

    Aici XX este codul limbii cu două litere (de exemplu, de) sau codul de limbă și regiune (de exemplu, en-GB).

    Pentru a adăuga un ansamblu subordonat, trebuie să adăugați un alt fișier .resx la proiect. al cărui nume trebuie să conțină un cod de localizare (separat de un punct), de exemplu welcome.de.resx. Când compilați în Visual Studio va crea automat subdirectoare (de exemplu, de), și într-un ansamblu de subordonat (de exemplu, MyApp.resources.dll).

    Culturile sunt împărțite în cultură și subcultură corespunzătoare. cultura reprezintă o limbă specifică, iar subcultura este o versiune regională a acestei limbi. Cultura este marcată printr-un cod de două litere (de exemplu, en.de) și subculturi prin intermediul unei litere de patru litere (en-AU, De-AT).

    În .NET, cultura este reprezentată de clasa System.Globalization.CultureInfo. Cultura actuală poate fi obținută în felul următor:

    Proprietatea CurrentCulture reflectă setările regionale ale Windows și proprietatea CurrentUICulture este limba interfeței de utilizator.

    Rezoluția de asamblare

    În timpul execuției, schema este oarecum mai complicată. Când accesați mai întâi un anumit tip, CLR determină mai întâi dacă este în ansamblul curent sau în ansamblul extern. Dacă tipul este într-un ansamblu extern, CLR verifică dacă acest ansamblu este deja încărcat în memorie. Dacă ansamblul nu este încărcat, CLR încearcă să o găsească. Primul pas este să verificați GAC, apoi directorul de bază al aplicației și alte căi de căutare (dacă sunt date). Dacă ansamblul nu a fost găsit, un eveniment AppDomain.AssemblyResolve este generat. care pot fi interceptate și încărcați manual ansamblul. Dacă după aceea ansamblul nu este încă găsit, CLR aruncă o excepție.

    Evenimentul EventResolve







    Articole similare

    Trimiteți-le prietenilor: