2016-07-30 1 views
0

Я пытаюсь создать архитектуру плагина, в которой dll будут включены в zip-файл, распакованы, сохранены, а затем загружены, чтобы определенный тип мог строиться и работать. Теоретически это звучит выполнимо. Но у меня проблема с этим. Я продолжаю получатьКак загрузить сборку и получить все типы в ней с помощью C# (без ReflectionTypeLoadException)

ReflectionTypeLoadException.

Вот что у меня есть, что не работает:

 var dlls = pluginFiles.Where(p => p.Value.FileInfo.Extension.ToLower() == ".dll").ToList(); 
     int num = 0; 
     foreach(var dll in dlls){ 
      var assembly = Assembly.LoadFile (dll.Value.FileInfo.FullName); 
      var pluginTypes = assembly.GetTypes().Where (p => p.IsSubclassOf (typeof (Plugin))); 
      foreach(var pluginType in pluginTypes){ 
       var ctor = pluginType.GetConstructors().FirstOrDefault(); 
       if (ctor == null) continue; 
       var plugin = (Plugin)ctor.Invoke (new object [] { }); 
       if (plugin == null) continue; 
       num++; 
       _mgr.RegisterNew (plugin); 
      }      
     } 

Как я пошаговое это отлаживать, исключение происходит в строке, где я бег assembly.GetTypes().

Что я здесь делаю неправильно? Должен ли я что-то делать с новым AppDomain?

Дополнительная информация: сборка, которую я загружаю, представляет собой тестовую сборку. У него есть ссылка на FakeItEasy. У этого есть один класс, который является классом, который я ищу. Этот конкретный класс является подклассом другого класса, который находится в сборке, на который ссылается мой вызывающий класс ... Это выглядело сбивающим с толку. Позвольте мне объяснить это так:

Сборка 1: Ядро, сборка 2: Dummy_assembly, Assembly 3: Tests.

  • Оба испытания и фиктивный_сопровождение ссылка Core.
  • Dummy_assembly - это dll, который я заархивировал, и пытаюсь распаковать, загрузить, а затем выполнить поиск.
  • Тесты - это сборка, из которой я вызываю метод, показанный выше.
  • Код, показанный выше, находится в Core.

Я смотрел this. Похоже, что это может быть применимо, но я не могу полностью сказать, как (и я не совсем понимаю, почему этот ответ работает на этот вопрос).

ответ

0

Если сборка включает в себя тип, который нельзя загрузить, он будет бросать (чаще всего потому, что на неразрешимой ссылке на сборку) ... об этом ничего нельзя сделать.

Но вы можете поймать исключение и проверить свойство Types и получить типы, которые МОГУТ быть успешно загружены.

https://msdn.microsoft.com/en-us/library/system.reflection.reflectiontypeloadexception.types(v=vs.110).aspx

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

+0

Что будет с ним обращаться? –

+0

https://msdn.microsoft.com/en-us/library/ff527268(v=vs.110).aspx – Jeff

0

Добавить блок try/catch вокруг кода gettypes. Обязательно зарегистрируйтесь где-нибудь, что вы не могли загрузить сборку для целей отладки.