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