Дозвіл завантаження зборок

В .NET Framework є подія AppDomain. AssemblyResolve для додатків, що вимагають додаткового управління завантаженням збірок. Обробляючи цю подію, додаток може завантажувати збірку в контекст завантаження не з каталогів, де зазвичай здійснюється пошук, вибирати, яку з версій збірки завантажити, створювати динамічну збірку і повертати її і багато іншого. У цьому розділі описується використання події AssemblyResolve.

Для вирішення завантаження зборок в контексті тільки для відображення використовуйте подія AppDomain. ReflectionOnlyAssemblyResolve.

При реєстрації обробника для події AssemblyResolve обробник викликається кожен раз, коли Виконавча не може зв'язати збірку під назвою. Наприклад, виклик наступних методів з призначеного для користувача коду може призвести до виникнення події AssemblyResolve.

Перевантаження методу AppDomain. Load або перевантаження методу Assembly. Load. де першим аргументом є рядок, що представляє коротке ім'я завантажується збірки (тобто рядок, яка повертається властивістю Assembly.FullName).

Перевантаження методу AppDomain. Load або перевантаження методу Assembly. Load. де першим аргументом є об'єкт AssemblyName. ідентифікує завантажується збірку.

Обробник події AssemblyResolve отримує псевдонім збірки, яку потрібно завантажити, в властивість ResolveEventArgs.Name. Якщо обробник не розпізнає ім'я збірки, він повертає значення NULL (Nothing в Visual Basic, nullptr в Visual C ++).

Якщо обробник розпізнає ім'я збірки, він може завантажити і повернути збірку, що відповідає запиту. У наступному списку наводиться кілька можливих сценаріїв.

Якщо обробник знає місце розташування версії збірки, він може завантажити збірку з допомогою методу Assembly. LoadFrom або Assembly. LoadFile і, якщо все пройшло вдало, повернути завантажену збірку.

Якщо у обробника є доступ до бази даних збірок, збережених у вигляді масивів байтів, він може завантажити масив байтів за допомогою однієї з перевантажень методу Assembly. Load. приймають масив байтів.

Оброблювач може створити динамічну збірку і повернути її.

Оброблювач повинен завантажувати збірку в контекст, з якого необхідно завантажити, в контекст завантаження або без контексту. Якщо обробник завантажує збірку в контекст тільки для відображення за допомогою методу Assembly. ReflectionOnlyLoad або Assembly. ReflectionOnlyLoadFrom. спроба завантаження, яка викликала подія AssemblyResolve. закінчується невдало.

Відповідальність за повернення відповідної збірки лежить на обработчике подій. Оброблювач може обробити псевдонім запитаної збірки, передавши значення властивості ResolveEventArgs.Name в конструктор AssemblyName (String). Починаючи з .NET Framework 4, обробник може використовувати властивість ResolveEventArgs.RequestingAssembly для визначення, чи перебуває поточний запит в залежності від іншої збірки. Ця інформація може допомогти знайти збірку, яка задовольнить залежність.

Оброблювач подій може повернути версію збірки, відмінну від запитаної.

У більшості випадків збірка, повернута оброблювачем, з'являється в контексті завантаження, незалежно від контексту, в який завантажує її обробник. Наприклад, якщо обробник використовує метод Assembly. LoadFrom для завантаження збірки в контекст, з якого необхідно завантажити, збірка з'являється в контексті завантаження, коли обробник повертає її. Однак в наступному випадку повернута оброблювачем збірка з'явиться без контексту.

Оброблювач завантажує збірку без контексту.

Сторона, яка запитує збірка (тобто складання, повернута властивістю ResolveEventArgs.RequestingAssembly) завантажена без контексту.

Додаткові відомості про контекстах см. В розділі про перевантаження методу Assembly. LoadFrom (String).

Кілька версій однієї збірки можна завантажити в один домен додатки. Робити так не рекомендується, оскільки це може привести до проблем призначення типу. Див. Розділ Рекомендації для завантаження зборок.

Основне правило обробки події AssemblyResolve полягає в тому, що не слід намагатися повернути збірку, яка не розпізнає. При написанні обробника слід враховувати, які збірки можуть викликати подія. Оброблювач повинен повертати значення NULL для інших збірок.

Починаючи з .NET Framework 4, подія AssemblyResolve викликається для допоміжних збірок. Ця зміна зачіпає обробник подій, написаний для більш ранньої версії .NET Framework, якщо обробник намагається вирішити всі запити на завантаження зборок. Це зміна не зачіпає обробники подій, котрі ігнорують не розпізнає збірки. Такі обробники повертають значення NULL, і спрацьовують звичайні резервні механізми.

При завантаженні збірки обробник подій не повинен використовувати будь-яку з перевантажень методу AppDomain. Load або Assembly. Load. які можуть викликати рекурсивне виникнення події AssemblyResolve. так як це може призвести до переповнення стека. (Див. Список вище в цьому розділі.) Це відбувається, навіть якщо обробляти виключення, оскільки виняток не створюється, поки все обробники подій не закінчать повернення. Таким чином, наступний код призведе до переповнення стека, якщо об'єкт MyAssembly не буде знайдений.

Схожі статті