2016-05-09 1 views
6

EDIT: я не упомянул одну важную информацию . - приложение, которое загружает мои сборки, фактически не находится в том же каталоге (как и другие dll) , После работы с журналом Fusion я заметил, что загрузка dll ведет себя по-другому, чем я думал раньше. (Да, я должен первый RTFM, позор мне)Невозможно загрузить тип `A` с сборки` Not.Containing.Type.A`

  • C:\Test\appLoadingStuff.exe
  • C:\Lib\Acme.Application.dll
  • C:\Lib\Acme.Data.dll
  • ...

.NET зондирует базу приложений (помимо GAC и прочее , где загружается приложение - C:\Test\), и не заботятся о местоположении, в котором загружены dll (другой каталог).


При использовании рамки .NET я обнаружил, что получаю ReflectionTypeLoadException исключение:

System.TypeLoadException

Не удалось загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительной информации.

Не удалось загрузить тип 'Acme.Data.Foo' из сборки 'Acme.Data.Dao, Version = 1.1.0.4, культура = нейтральной, PublicKeyToken = нуль'. ":" Acme.Data.Foo

у меня есть, для простоты, 3 сборки:

  • Acme.Application моего основной узел
  • Acme.Data моих данных объектов (ссылка на 1-ом)
  • Acme.Data.Dao моего объективистский доступ к данным ts (ссылка на 1-й)

И есть еще одно приложение, которое фактически загружает мой основной сбор. Все файлы .dll находятся в одном каталоге.

Как и следовало ожидать, тип Acme.Data.Foo живет в сборе Acme.Data. Несмотря на это, .NET пытается найти его в другой сборке Acme.Data.Dao - что не получается, поскольку этого типа нет.

Я не могу понять, что делает .NET, который ищет этот конкретный тип в неправильной сборке. Исключение генерируется непосредственно при доступе типов по сборке:

System.Reflection.RuntimeAssembly assembly = Assembly.LoadFile("C:\Lib\Acme.Application.dll") 
var types = assembly.GetTypes(); // -> explodes 

Когда я попытался проверить ссылки сборки с помощью:

assembly.GetReferencedAssemblies() 

я могу ясно видеть мой нужный узел в списке.

Нет перенаправления сборки (и насколько я знаю, это влияет только на версию). Версии сборок правильные.

Что еще я должен искать?

+0

Есть ли более подробная информация в «LoaderExceptions», предложенная сообщением об исключении, или это то, что второе сообщение в сообщении? –

+0

@MartinCostello да, это в основном то второе сообщение, которое имеет смысл только с половины (тип на самом деле не существует, но сборка, где тип ссылается, поэтому почему она ищет ее там) –

+0

Может ли кто-нибудь удалить тег «Assembly»? Я нечаянно потратил впустую свое «редактирование» голосования на редактирование. –

ответ

1

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

.NET является зондирующим каталогом запущенного приложения, а не каталогами, в которых загружены DLL. Если нужно обработать такой случай, необходимо выполнить обработчик событий AppDomain.AssemblyResolve, чтобы заботиться о зависимостях загруженных dll.

Больше чтение:

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

 Смежные вопросы

  • Нет связанных вопросов^_^