В моем приложении 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(...)
, но это тоже не работает.
Я также попробовал этот подход без успеха.
Есть идеи, как я могу загрузить сборки со всеми зависимостями и затем создать экземпляр?