GetType (строка) возвращает нуль после AppDomain.CurrentDomain.Load - PullRequest
1 голос
/ 22 февраля 2011

Я создаю небольшую плагиновую архитектуру (к сожалению, MEF не вариант, потому что он должен работать на .NET 2.0). Я хочу иметь возможность помещать DLL в каталог без перекомпиляции основного проекта. Мой основной проект - это приложение winforms, в котором есть несколько диалогов для выбора реализации интерфейса, в котором нуждается основная программа.

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

public List<Type> GetPluginTypes()
{
  List<Type> types = new List<Type>();
  foreach (string dll in this.Plugins)
  {
    Assembly assembly;
    try
    {
      assembly = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(dll));
    }
    catch
    {
      continue;
    }
    foreach (Type type in assembly.GetExportedTypes())
    {
      if (type.IsInterface || type.IsAbstract)
        continue;

      if (typeof(IMyInterface).IsAssignableFrom(type))
       types.Add(type);
    }
  }
  return types;
}

Используя этот метод, я показываю пользователю список реализаций, одна из которых выбрана, и ее AssemblyQualifiedName сохраняется в файле настроек.

Когда я запускаю основное приложение, я загружаю AQN из настроек и загружаю все плагины в домен приложений, вызывая вышеуказанный метод.

string typeName = GetSetting("MyPlugin");
GetPluginTypes(); // just to load the plugins into the app domain
Type.GetType(typeName); // allways returns null.

Вот моя проблема: Type.GetType (typeName), всегда возвращает ноль.

Я использовал Type.GetType (typeName, true), чтобы применить исключение, которое я получил: Не удалось загрузить файл или сборку «MyImpl, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null» или одна из ее зависимостей. Системе не удается найти указанный файл. ":" MyImpl, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null "}

Я не в курсе. Я уже загрузил сборку в AppDomain, но Type.GetType (строка) не может найти ее, когда я указываю AQN.

Ответы [ 2 ]

3 голосов
/ 08 апреля 2015

Эту проблему можно решить, зарегистрировав событие AppDomain.AssemblyResolve для AppDomain, которое запросит сборку и заставит обработчик вернуть уже загруженную сборку.

Вот как выглядит обработчик в C #:

    private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        return
            AppDomain.CurrentDomain.GetAssemblies()
            .FirstOrDefault(Kandidaat => string.Equals(Kandidaat.GetName().FullName, args.Name));
    }

подробное объяснение можно найти здесь: https://msdn.microsoft.com/en-us//library/ff527268(v=vs.110).aspx

1 голос
/ 22 февраля 2011

Возможно, это актуально.Из документации для Type.GetType (String, Boolean) :

Если typeName включает только имя Type, этот метод выполняет поиск в сборке вызывающего объекта, а затем вСборка mscorlib.dll.Если typeName полностью определено с частичным или полным именем сборки, этот метод выполняет поиск в указанной сборке.

Вы сказали, что пытаетесь вызвать с type.AssemblyQualifiedName, но это не удалось.Вы проверили правильное имя, чтобы увидеть, было ли это разумным?

...