Permisiune pentru încărcarea ansamblurilor

.NET Framework are un eveniment AppDomain. AdvanceResolve pentru aplicații care necesită o gestionare suplimentară a sarcinilor pentru ansambluri. Prin procesarea acestui eveniment, aplicația poate încărca ansamblul în contextul descărcării, nu din directoarele în care se efectuează de obicei căutarea, alegeți ce versiune a ansamblului se încarcă, creați un ansamblu dinamic și returnați-l și multe altele. Această secțiune descrie modul de utilizare a evenimentului AssemblyResolve.

Pentru a permite încărcarea ansamblurilor într-un context de reflecție, utilizați evenimentul AppDomain. ReflectionOnlyAssemblyResolve.

Când înregistrați un handler pentru evenimentul AssemblyResolve, manipulatorul este apelat de fiecare dată când timpul de execuție nu poate asocia un ansamblu după nume. De exemplu, apelarea următoarelor metode dintr-un cod definit de utilizator poate duce la un eveniment AssemblyResolve.

Supraîncărcarea metodei AppDomain. Încărcarea sau suprasarcina metodei Assembly. Load. unde primul argument este un șir reprezentând numele afișat al ansamblului încărcabil (adică șirul returnat de proprietatea Assembly.FullName).

Supraîncărcarea metodei AppDomain. Încărcarea sau suprasarcina metodei Assembly. Load. unde primul argument este obiectul AssemblyName. care identifică ansamblul încărcat.

Managerul de evenimente AssemblyResolve primește numele afișat al ansamblului pe care doriți să-l încărcați în proprietatea ResolveEventArgs.Name. Dacă manipulatorul nu recunoaște numele ansamblului, acesta returnează o valoare NULL (Nimic în Visual Basic, nullptr în Visual C ++).

Dacă manipulatorul recunoaște numele ansamblului, acesta poate încărca și returna ansamblul care corespunde interogării. Următoarea listă prezintă câteva scenarii posibile.

Dacă manipulatorul cunoaște locația versiunii de asamblare, poate încărca ansamblul folosind metoda de asamblare. LoadFrom sau Adunarea. LoadFile și, dacă totul merge bine, întoarceți ansamblul încărcat.

Dacă manipulatorul are acces la baza de date a ansamblului stocată ca arbori octeți, poate încărca o matrice de octeți utilizând una dintre supraîncărcările metodei Assembly. Load. primind o serie de octeți.

Operatorul poate crea un ansamblu dinamic și îl poate returna.

Operatorul trebuie să încarce ansamblul în contextul de la care se face încărcarea, în contextul de încărcare sau fără context. Dacă manipulatorul încarcă ansamblul în context numai pentru reflecție folosind metoda de asamblare. ReflectionOnlyLoad sau Adunare. ReflectionOnlyLoadFrom. Tentația de descărcare care a provocat evenimentul AssemblyResolve. se încheie fără succes.

Responsabilitatea pentru returnarea unei ansambluri adecvate se află pe dispozitivul de gestionare a evenimentului. Operatorul poate procesa numele afișat al ansamblului solicitat prin trecerea valorii proprietății ResolveEventArgs.Name la constructorul AssemblyName (String). Începând cu .NET Framework 4, manipulatorul poate folosi proprietatea ResolveEventArgs.RequestingAssembly pentru a determina dacă cererea curentă se bazează pe un alt ansamblu. Aceste informații vă pot ajuta să găsiți un ansamblu care să satisfacă dependența.

Managerul evenimentului poate returna o versiune de asamblare diferită de cea solicitată.

În cele mai multe cazuri, ansamblul returnat de manipulator apare în contextul sarcinii, indiferent de contextul în care încărcătorul său se încarcă. De exemplu, dacă utilizatorul utilizează metoda de asamblare. LoadFrom pentru a încărca ansamblul în contextul din care se execută sarcina, ansamblul apare în contextul încărcării atunci când mânerul îl returnează. Cu toate acestea, în următorul caz, ansamblul returnat de manipulator va apărea fără context.

Manipulatorul încarcă ansamblul fără context.

Ansamblul solicitant (adică ansamblul returnat de proprietatea ResolveEventArgs.RequestingAssembly) este încărcat fără context.

Pentru mai multe informații despre contexte, consultați supraîncărcarea metodei Assembly. LoadFrom (String).

Versiuni multiple ale aceluiași ansamblu pot fi descărcate într-un singur domeniu de aplicații. Nu se recomandă acest lucru, deoarece acest lucru poate duce la probleme de asignare de tip. Consultați Recomandările pentru încărcarea ansamblurilor.

Principala regulă pentru procesarea evenimentului AssemblyResolve este că nu ar trebui să încercați să returnați un ansamblu care nu este recunoscut. Atunci când scrieți un handler, trebuie să luați în considerare ansamblurile care pot declanșa evenimentul. Operatorul trebuie să returneze o valoare NULL pentru alte ansambluri.

Începând cu .NET Framework 4, evenimentul AssemblyResolve este solicitat pentru ansamblurile auxiliare. Această modificare afectează modulul de gestionare a evenimentului scrise pentru o versiune anterioară a .NET Framework dacă manipulatorul încearcă să rezolve toate solicitările de încărcare a ansamblurilor. Această modificare nu afectează agenții de procesare a evenimentelor care ignoră ansamblurile nerecunoscute. Astfel de utilizatori returnează valoarea NULL, iar mecanismele normale de rezervă sunt declanșate.

Când se încarcă un ansamblu, manipulatorul evenimentului nu trebuie să utilizeze nici o suprasolicitare a metodei AppDomain. Încărcați sau montați. Load. care poate provoca un eveniment recursiv al evenimentului AssemblyResolve. deoarece acest lucru poate duce la supraîncărcarea stivei. (A se vedea lista de mai sus în această secțiune.) Acest lucru se întâmplă chiar dacă gestionați excepțiile, deoarece nu este aruncată o excepție până când toți operatorii de evenimente returnate. Astfel, următorul cod va duce la depășirea stivei, dacă obiectul MyAssembly nu este găsit.

Articole similare