BuildManager.GetReferencedAssemblies эквивалент для не-веб-приложений
По сравнению с AppDomain.GetAssemblies()
, BuildManager.GetReferencedAssemblies()
(System.Web.Compilation.BuildManager) представляется более надежным способом получения сборок, на которые ссылается Приложение ASP.NET во время выполнения, поскольку AppDomain.GetAssemblies() получает только "сборки, которые уже были загружены в контекст выполнения этого домена приложения".
Итерация через все сборки - важный инструмент для динамической регистрации типов при запуске приложения в вашем контейнере DI, и особенно во время запуска приложения, скорее всего, другие сборки не загружены (где не нужны), а композиция root - это первый, который им нужен. Поэтому очень важно иметь надежный метод для получения ссылок на заявки, на которые ссылаются.
Хотя BuildManager.GetReferencedAssemblies()
является надежным методом для приложений ASP.NET, мне интересно: какие альтернативы доступны для других типов приложений, таких как настольные приложения, службы Windows и самообслуживания Услуги WCF?
Ответы
Ответ 1
Единственный способ, который я сейчас вижу, - предварительно собрать все ссылочные сборки вручную, так же, как BuildManager
делает под обложками:
var assemblies =
from file in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory)
where Path.GetExtension(file) == ".dll"
select Assembly.LoadFrom(file);
Ответ 2
У меня была такая же проблема. И после некоторых исследований я до сих пор не нашел надежного ответа. Самое лучшее, что я придумал, - объединить AppDomain.CurrentDomain.GetAssemblies()
с событием AppDomain.AssemblyLoad
.
Таким образом, я могу обрабатывать все уже загруженные сборки, получая уведомление для всех новых сборок (которые я затем просматриваю).