Сборочные ссылки для динамически загружаемых DLL - PullRequest
1 голос
/ 26 октября 2009

у меня 4 сборки:

  1. Tester.exe
  2. ToyInterface.dll
  3. ToyFactory.dll -> ссылка (ToyInterface.dll)
  4. Toy.dll -> ссылка (ToyInterface.dll)

Tester.exe

internal ICollection<string> Scan(string path){
  return ToyCollection = _reportFactoryType.GetMethod(FACTORY_GET_TOYS).
                            Invoke(_ToyFactory, null);
}

ToyFactory.dll

...try
{
// Load assembly:
    Assembly asm = Assembly.LoadFrom(fileFullPath);
    // Reflect ToyInterface types:
    IEnumerable<Type> types = asm.GetExportedTypes();
}

и я получаю исключение

Не удалось загрузить файл или сборку 'ToyInterface, версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null ' или одна из его зависимостей. Система не могу найти файл указано. ":" ToyInterface, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = нуль

Информация о привязке из fuslogvw.exe показывает, что сборка доступна по пути среды Tester.exe. Почему это так и как я могу это изменить?

Ответы [ 3 ]

1 голос
/ 26 октября 2009

Вы не указываете, но я предполагаю, что Toy.exe также зависит от ВСЕХ других dll? право? Потому что, если это не так, то процесс компиляции не скопирует их в каталог исполняемых файлов Toy.exe. Проверьте этот справочник и убедитесь, что все три dll присутствуют и имеют штамп даты и времени с момента последнего компиляции ...

Если все это kewl, то возможно, что ToyInterface.dll зависит от некоторой другой библиотеки DLL (не упомянутой), которая находится в папке разработки Visual Studio, но не копируется в папку времени выполнения ...

Если вы динамически загружаете эти другие библиотеки, не делайте ошибку, предполагая, что они загружают свои собственные зависимые библиотеки самостоятельно. Все зависимые библиотеки DLL загружаются на основе папки базового кода исполняемой сборки (папки, из которой она была загружена), а не папок библиотеки DLL, в которых может выполняться метод Assembly.LoadFrom ... Так что если вы хотите, чтобы библиотека DLL была загруженный не из папки загрузки Toy.exe (или из подкаталога этой папки), попробуйте указать полный путь Absolute к dll в методе Assembly.LoadFrom() и посмотрите, исправляет ли это что-то

1 голос
/ 26 октября 2009

Я нашел проблему! Похоже, я страдал от адского связывания DLL. (

Это сообщение в блоге помог мне обнаружить, что мне нужно использовать функцию Assembly.LoadFrom(), а не Assembly.LoadFile(). Теперь Aseembly и его зависимости проверяются в правильных каталогах.

Спасибо всем за помощь!

0 голосов
/ 26 октября 2009

Вы пытались поместить все сборки в один каталог?

...