Не все сборки загружаются в 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();
    }  

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

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

3 ответов


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

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

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

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


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

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


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