Я намагаюся створити пакет клієнтського програмного забезпечення .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, яка запускається, коли збірка не знайдена, а потім завантажте збірку, яку вона намагається знайти.
Ви повинні прочитати цю статтю.