Загрузка dll не из корневого каталога - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет! Помогите, пожалуйста, решить проблему. Я пишу консольную программку, которая загружает из определённой папки dll-файлы. В каждом из dll есть класс, который реализует интерфейс IPlugin, и наследуется от MarshalByRefObject.

Необходимо учесть 3 нюанса:

  1. Необходимо загружать в разные AppDomain
  2. Файлы сборки лежат не в корневой папке где exe, а в отдельной, для плагинов(Plugins\plugins1\Plugins1.dll и Plugins\Plugins2\Plugins2.dll)
  3. Не известно зарание структура dll. Т.е. нельзя хардкодить неймспейс и класс, как показано ниже:
    C#
Пробовал загружать через метод Load:
                        var domain = AppDomain.CreateDomain("NewDomain");
                        var buffer = File.ReadAllBytes(file);
                        var assembly = domain.Load(buffer);
Так работает только для сборок, которые лежат на одном уровне с ехе(не выполняется второе условие). Для dll внутри каталогов вылетает ошибка Could not load file or assembly... Прочитал где-то, что можно использовать CreateInstanceFromAndUnwrap - с ним работает, но в него нужно передавать неймспейс и класс из сборки, а я его не знаю(3 условие). Знаю только что он реализует интерфейс IPlugin. Помогите, пожалуйста, подскажите можно ли вообще при таких условиях загрузить сборки? Если можно то как?? -- С уважением, Виктор

Решение задачи: «Загрузка dll не из корневого каталога»

textual
Листинг программы
using System;
using System.IO;
using Interface;
 
namespace MainApp
{
    internal class Program
    {
      private static void Main(string[] args)
        {
            var folder = AppDomain.CurrentDomain.BaseDirectory;
            try
            {
                foreach (var path in Directory.GetDirectories(folder + "Plugins"))
                {
                    var files = Directory.GetFiles(path, "*.dll");
                    foreach (string file in files)
                    {
                        var domain = AppDomain.CreateDomain("NewDomain");
 
                        var buffer = File.ReadAllBytes(file);
                        var assembly = domain.Load(buffer);
 
                        foreach (var type in assembly.GetTypes())
                        {
                            var iface = type.GetInterface(typeof(IPlugin).Name);
 
                            if (iface != null)
                            {
                                var plugin = (IPlugin)Activator.CreateInstance(type);
                                Console.WriteLine(plugin.Version);
                            }
                        }
                        AppDomain.Unload(domain);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
 
            Console.ReadKey();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы