Загрузить сборку с зависимыми ссылками - PullRequest
0 голосов
/ 05 июня 2018

В моем приложении interface называется IPlugin.Этот interface используется для идентификации dll в папке плагинов и загрузки их при запуске приложения.

Интерфейс IPlugin выглядит следующим образом:

public interface IPlugin
{
  string Name { get; }

  void Initialize();
}

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

internal List<IPlugin> LoadPlugins()
{
    List<IPlugin> plugins = new List<IPlugin>();

    foreach (string file in Directory.GetFiles("Plugins", "*.dll", SearchOption.TopDirectoryOnly))
    {
        Assembly assembly = Assembly.LoadFile(Path.GetFullPath(file));
        Type targetType = assembly.GetTypes().FirstOrDefault(type => type.GetInterfaces().Contains(typeof(IPlugin)));
        if (targetType != null)
        {
            IPlugin plugin = Activator.CreateInstance(targetType) as IPlugin;
            if (plugin != null)
            {
                plugins.Add(plugin);
            }
        }
    }
    return plugins;
}

Это просто отлично работает для DLL, которые не нуждаются в другой DLL.

Теперь я создал плагин, который имеет две библиотеки DLL.

  • Users.Interface
  • Users.Plugin

Users.Plugin содержит ссылки на Users.Interface.В Users.Plugin есть реализация IPlugin.Таким образом, Users.Plugin-Dll будет определен как загружаемый моим методом LoadPlugins.

Теперь я получаю ReflectionTypeLoadException с файлом Users.Plugin в строке:

Type targetType = assembly.GetTypes().FirstOrDefault(type => type.GetInterfaces().Contains(typeof(IPlugin)));

LoaderException говорит мне, что сборка Users.Interface или ссылка не может бытьнайдено.

Я пытался использовать Assembly.LoadFrom(...), но это тоже не работает.

Я также попробовал этот подход без успеха.

Есть идеи, как я могу загрузить сборки со всеми зависимостями и затем создать экземпляр?

1 Ответ

0 голосов
/ 05 июня 2018

Фрагмент кода для разрешения сборок во время выполнения:

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {

    String DllName = new AssemblyName(args.Name).Name + ".dll";

    return Assembly.LoadFile(DllName);
}

Установите его в начале инициализатора вашего плагина:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

Проверка ошибок не включена.

Фактическая сборка может быть загружена с любого пути, пример выше загружает ее из текущего рабочего каталога.Вы также можете загрузить его из встроенного ресурса.

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