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

Не все сборки загружаются в AppDomain из папки bin

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

static IEnumerable<Assembly> GetLocalAssemblies()
    {
        Assembly callingAssembly = Assembly.GetCallingAssembly();
        string path = new Uri(Path.GetDirectoryName(callingAssembly.CodeBase)).AbsolutePath;

        var assemblies = AppDomain.CurrentDomain.GetAssemblies();
        return assemblies.Where(x => !x.IsDynamic && new Uri(x.CodeBase).AbsolutePath.Contains(path)).ToList();
    }  

Но в списке сборок отсутствует пара сборок, которые мне нужны. Мне нужны управляемые сборки (С#.net 4), которые ссылаются в проекте и присутствуют в папке bin.

Почему двоичные файлы, которые присутствуют в папке bin, не попадают в AppDomain при запуске приложения?

4b9b3361

Ответ 1

Адиль имеет это, но более подробно:

.NET CLR использует компиляцию Just-In-Time. Помимо всего прочего, это означает, что он загружает сборки при первом использовании. Таким образом, несмотря на то, что сборки, на которые ссылается используемая сборка, если ссылки для CLR еще не были необходимы для выполнения программы, они не загружаются и поэтому не будут отображаться в списке сборок в текущем AppDomain.

Еще одна вещь, которая может или не может применяться, заключается в том, что если у вас есть такая же версия сборки в GAC, CLR использует GAC преимущественно над локальными сборками, ЕСЛИ путь к этим сборкам указан в переменной среды DEVPATH, Если это так, и CLR использует копию GAC любой из "отсутствующих" сборок, они будут иметь разные значения CodeBase и не будут отображаться в результатах вашего Linq-запроса.

Еще одна вещь: вы можете захотеть использовать свойство Location вместо свойства CodeBase. Свойство Location содержит абсолютный путь к сборке, которая была загружена во время выполнения. Свойство CodeBase несколько отличается и может быть не одинаковым для всех сборок в полной сборке проекта.

Ответ 2

CurrentDomain.GetAssemblies() возвращает только загруженные сборки не всех сборок, доступных в папке исполнения.

Это то, что Microsoft говорит об этом "GetAssemblies метод, чтобы получить список всех сборок, которые были загружены в домен приложения". нажмите здесь

Ответ 3

Попробуйте запустить любой класс в этих отсутствующих сборках, а затем снова запустите свой код. Сборки загружаются при необходимости только при первом вызове на все, что связано с этой сборкой.