2016-11-14 3 views
3

В нашем приложении (решение с 65 проектами) все ссылочные сборки анализируются во время выполнения для наличия модулей Ninject (применяется некоторая фильтрация слишком). Модули загружаются позже в ядро ​​Ninject, и каждый модуль объявляет привязки для ядра.Метод не имеет реализации при загрузке сборок в новый AppDomain в режиме ReflectionOnly

Мы приняли загрузчик, который загружает ссылочные сборки в отдельный сборник только в режиме отражения. Разница в том, что Ninject может загружать сборки из каталога, заключается в том, что каталог может содержать сборки с модулями, которые не должны загружаться. А также с самого начала загружаются не все ссылочные сборки.

Проблема заключается в том, что loader (кредит Sacha Barber) не может загрузить некоторые узлы с

System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information 

и LoaderExceptions с одной записью:

Method 'BeforeLoad' in type 'Lekis.AppBase.Core.BLLBaseCore' from assembly 'AppBaseCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation. 

Вот некоторые "забавные" факты :

  • метод BeforeLoad является виртуальным и реализуется метода интерфейса
  • на прошлой неделе исключение загрузчика означало, что у другого метода не было реализации (этот метод не был виртуальным), а позже, когда я его явно реализовал, сообщение сообщило, что метод не найден.
  • на прошлой неделе целевая основа для сборки AppBaseCore был .NET 3.5 и 3 сборки не удалось загрузить
  • теперь целевая основа для сборки AppBaseCore является .NET 4 и 5 сборок не удалось загрузить
  • все в порядке с приложением в противном случае

Нет ничего плохого (очевидно) с сборками, когда я проверил их с помощью ILSpy и ILDAsm.

На данный момент я действительно потерян и не знаю, как подойти к этой проблеме.

Любая помощь приветствуется.

Благодаря

+1

«метод' BeforeLoad' является виртуальным и реализует интерфейсный метод ». правда, правда? Проверьте [все ответы здесь] (http://stackoverflow.com/questions/948785/), чтобы убедиться, что вы не сталкиваетесь с конфликтом версий и загрузки.ILSpy/ILDAsm не сообщают о каких-либо проблемах, поскольку сборка является структурно обоснованной. –

+0

Спасибо, @JeroenMostert. Я посмотрю на это. –

ответ

3

Ответ на свой вопрос:

Когда было брошено исключение, я подошел трассировку стека и перечислены сборки, загруженные в детской AppDomain создан:

AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies() 
{System.Reflection.RuntimeAssembly[15]} 
... 
[13]: {System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089} 
[14]: {System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089} 

и замеченного две версии сборки System.Data. Этот метод имеет параметр типа System.Data.IDbTransaction.

Первый упоминался в проекте, ориентированном на .NET framework 3.5. После его изменения до 4.0 все работает нормально.

Какая глупая проблема ...

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