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

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

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

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

Ответы на вопрос(3)

У нас была та же проблема. И после некоторого исследования яМы до сих пор не нашли надежного ответа. Лучший ямы придумаем это объединитьAppDomain.CurrentDomain.GetAssemblies() сAppDomain.AssemblyLoad событие.

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

 jgauffin08 окт. 2012 г., 14:11
Не то чтобы ямы обнаружили нет. В этом случае выВам нужно будет вручную загрузить все сборки из папки приложения.
 Steven08 окт. 2012 г., 14:05
к несчастьюAssemblyLoad победил'не работает, так как он будет запущен после загрузки сборки, а проблема в том, что сборки нет заранее выбранный. Я'm ищет встроенный механизм, который предварительно выбирает сборки, так же какBuildManager делает. Но, возможно, нетВсе, что встроено в .NET Framework. (но +1 за беспокойство)

Это решение основано на @steven 'ответ. Но будет работать в Web, WinForms, Consoles и Windows Services.

var binDirectory = String.IsNullOrEmpty(AppDomain.CurrentDomain.RelativeSearchPath) ? AppDomain.CurrentDomain.BaseDirectory : AppDomain.CurrentDomain.RelativeSearchPath;

var assemblies = from file in Directory.GetFiles(binDirectory)
                 where Path.GetExtension(file) == ".dll"
                 select Assembly.LoadFrom(file);
Решение Вопроса

Единственный способ, которым я сейчас вижу, - это предварительная загрузка всех сборок, на которые есть ссылки, вручную, так же какBuildManager делает под одеялом:

var assemblies =
    from file in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory)
    where Path.GetExtension(file) == ".dll"
    select Assembly.LoadFrom(file);
 Ahuman01 июн. 2018 г., 23:13
Этот код нея не работаю в веб-приложении.

Ваш ответ на вопрос