Сборка .NET в текущем домене не может быть найдена - PullRequest
1 голос
/ 14 декабря 2010

У меня есть проект, над которым я работаю, который будет искать во всех загруженных сборках любой класс, реализующий определенный интерфейс.Затем он создаст экземпляр этого класса и вызовет метод интерфейса.Код отлично работал на простых проектах в средах тестирования.В основе этого лежит следующая функция:

    public static List<Type> GetLoadedTypes(Type targetType)
    {
        var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
            .SelectMany(a => a.GetTypes())
            .Where(t => targetType.IsAssignableFrom(t)).ToList();
        return types;
    }

У меня есть другой проект, в который вставлен этот код, и запрос LINQ не выполняется, поскольку не удается найти одну из сборок в домене.

System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'Microsoft.Practices.ObjectBuilder, версия = 1.0.51206.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a' или одна из ее зависимостейСистема не может найти указанный файл.

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

РЕДАКТИРОВАТЬ: Я использую Enterprise Library в проекте, но я уже ссылаюсь на Microsoft.Practices.ObjectBuilder2.dll,Видимо, есть разница между двумя сборками.Это правильно?

Спасибо!Джефф

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

Вы можете использовать «Средство просмотра журнала привязки сборки» (Fuslogvw.exe), принадлежащее dotnet2.0sdk (возможно, также в более поздней редакции). Если ведение журнала включено, это может показать, какие сборки загружены и какая сборка вызвала их загрузку.

Подробнее см. http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.80).aspx

1 голос
/ 14 декабря 2010

Используется Microsoft Unity . Скопируйте DLL в свою корзину во время сборки (используя скрипт, ...) или добавьте ссылку.


Обновление

Чтобы выяснить это, можно добавить событие AssemblyResolve в AppDomain и проверить свойство RequestingAssembly в аргументах.


Обновление 2

Хорошо, вот как бы я подошел к нему:

  • Используйте procmon sysinternal для мониторинга вашего исполняемого файла. Вы увидите имя файла (objectbuilder2), всплывающего с большим количеством событий FILE NOT FOUND. Посмотрите, где он ищет это, вам нужно, чтобы он был там. Я думаю, что DLL загружается в другом месте
  • Убедитесь, что эта конкретная версия DLL существует
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...