Загрузка 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();
}
}
}