Catch dll loading - .net, dll, load, ondemand

Я намагаюся створити пакет клієнтського програмного забезпечення .NET, який завантажує його компоненти на вимогу.

Скажімо, у мене є програма, яка розділена на aГоловний виконуваний файл і 20 інших файлів DLL. Основна програма посилається на 3 з них, вони посилаються на деякі інші, так чи інакше ... вони мають якусь структуру залежностей дерева.

Те, що я намагаюся досягти, це поширювати тільки головний виконуваний файл і отримувати все інше з розташування сервера на вимогу.

Щось на зразок цього: Основна програма і всі ці проекти DLL знаходяться в єдиному рішенні і будуються разом, як і будь-яке інше рішення. При розповсюдженні розповсюджується тільки exe, інші dll (у тому числі деякі використовувані бібліотеки третіх сторін) розміщуються в доступному для завантаження сервері.

Exe виконується, показує деякий UI, коли користувач натискаєпункт меню, інше вікно інтерфейсу з одного файлу dll буде показано так, що ОС шукає dll (якого там немає), я втручаюся, завантажую необхідний dll з сервера, ставлю його поруч з exe і пускаємо ОС завантажує її так, ніби вона була з самого початку.

Це виглядає досяжним завдяки використанню загальногоКлас інтерфейсу і деяка магія відображення, але я сподівався на щось більше, те, що включає в себе побудову dll в цілому в одному рішенні, те, що включає в себе завантаження на вимогу сторонніх бібліотек.

Будь-які ідеї, як це зробити?

Відповіді:

1 для відповіді № 1

Ви шукаєте AppDomain.AssemblyResolve подія, яка дозволяє завантажувати збірки зі спеціальних місць.
Ви не потребуватимете жодного іншого відображення.


1 для відповіді № 2

Надайте обробники подій для подій AppDomain.ResolveAssembly та AppDomain.ResolveType для поточного домену програми та завантажте збірки.

Але будьте обережні, щоб завантажити збірки в правильний контекст: http://msdn.microsoft.com/en-us/library/dd153782.aspx


1 для відповіді № 3

Ви можете обробити подію AssemblyResolve, яка запускається, коли збірка не знайдена, а потім завантажте збірку, яку вона намагається знайти.

Ви повинні прочитати цю статтю.