Подтвердить что ты не робот

BuildManager.GetReferencedAssemblies эквивалент для не-веб-приложений

По сравнению с AppDomain.GetAssemblies(), BuildManager.GetReferencedAssemblies() (System.Web.Compilation.BuildManager) представляется более надежным способом получения сборок, на которые ссылается Приложение ASP.NET во время выполнения, поскольку AppDomain.GetAssemblies() получает только "сборки, которые уже были загружены в контекст выполнения этого домена приложения".

Итерация через все сборки - важный инструмент для динамической регистрации типов при запуске приложения в вашем контейнере DI, и особенно во время запуска приложения, скорее всего, другие сборки не загружены (где не нужны), а композиция root - это первый, который им нужен. Поэтому очень важно иметь надежный метод для получения ссылок на заявки, на которые ссылаются.

Хотя BuildManager.GetReferencedAssemblies() является надежным методом для приложений ASP.NET, мне интересно: какие альтернативы доступны для других типов приложений, таких как настольные приложения, службы Windows и самообслуживания Услуги WCF?

4b9b3361

Ответ 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.

Таким образом, я могу обрабатывать все уже загруженные сборки, получая уведомление для всех новых сборок (которые я затем просматриваю).