Невозможно загрузить один или несколько запрошенных типов. извлекать исключения - PullRequest
1 голос
/ 04 марта 2011

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

Вот код интерфейса:

namespace Test
{
  public interface ITestBase
  {
    int LifeTheUniverseAndEverything();
    bool Pessimist();
    bool Optimist();
  }
}

Это сборка в .dll, на которую ссылается основное программное решение иРешение для плагина.

Вот код плагина:

namespace Test
{
  public class TestPlugin : ITestBase
  {
    public int LifeTheUniverseAndEverything() { return 41; }
    public bool Pessimist() { return false; }
    public bool Optimist() { return true; }
  }
}

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

Вот основная программа.

namespace Test
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("testing...");
      string[] PluginFileLocs;
      try
      {
        string sWorkingDir = Directory.GetCurrentDirectory();
        string sPluginDir = sWorkingDir + "\\Plugins";
        PluginFileLocs = Directory.GetFiles(sPluginDir, "*.dll");
        foreach (string plugin in PluginFileLocs)
        {
          Assembly theAssembly = Assembly.ReflectionOnlyLoadFrom(plugin);
          foreach (Type type in theAssembly.GetTypes())
          {
            string aType = type.FullName;
            Console.WriteLine(aType);
          }
        }
      }
      catch (Exception e)
      {
        Console.WriteLine("Error: " + e.Message);
      }
    }
  }
}

Проблема заключается в том, что если класс testplugin наследует интерфейс ITestBase, то объект AsAsmbly.GetTypes создает исключение: невозможно загрузить один или несколько запрошенных типов.получить исключения LoaderExceptionПочему и как я могу получить свой плагин для создания интерфейса?

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

На основании документации для Assembly.ReflectionOnlyLoadFrom он не будет автоматически загружать зависимости http://msdn.microsoft.com/en-us/library/system.reflection.assembly.reflectiononlyloadfrom.aspx

Я предполагаю, что здесь происходит. Поскольку ваш интерфейс определен в отдельной сборке от плагина, вы должны сначала загрузить эту сборку, прежде чем пытаться вызвать GetTypes.

1 голос
/ 04 марта 2011

Без дальнейших подробностей сказать сложно. Я предполагаю, что вы загружаете его в контекст «Только отражение» с помощью ReflectionOnlyLoadFrom, который не разрешает зависимости, а интерфейс и плагины находятся в разных сборках, вам нужно обработать ReflectionOnlyAssemblyResolve на AppDomain, или не загружайте его в контексте только для отражения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...