Я создаю небольшую плагиновую архитектуру (к сожалению, MEF не вариант, потому что он должен работать на .NET 2.0).
Я хочу иметь возможность помещать DLL в каталог без перекомпиляции основного проекта.
Мой основной проект - это приложение winforms, в котором есть несколько диалогов для выбора реализации интерфейса, в котором нуждается основная программа.
У меня есть метод, который выполняет поиск в определенном каталоге и выдает список местоположений библиотек DLL, которые я хочу найти для типов, реализующих интерфейс.
public List<Type> GetPluginTypes()
{
List<Type> types = new List<Type>();
foreach (string dll in this.Plugins)
{
Assembly assembly;
try
{
assembly = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(dll));
}
catch
{
continue;
}
foreach (Type type in assembly.GetExportedTypes())
{
if (type.IsInterface || type.IsAbstract)
continue;
if (typeof(IMyInterface).IsAssignableFrom(type))
types.Add(type);
}
}
return types;
}
Используя этот метод, я показываю пользователю список реализаций, одна из которых выбрана, и ее AssemblyQualifiedName сохраняется в файле настроек.
Когда я запускаю основное приложение, я загружаю AQN из настроек и загружаю все плагины в домен приложений, вызывая вышеуказанный метод.
string typeName = GetSetting("MyPlugin");
GetPluginTypes(); // just to load the plugins into the app domain
Type.GetType(typeName); // allways returns null.
Вот моя проблема: Type.GetType (typeName), всегда возвращает ноль.
Я использовал Type.GetType (typeName, true), чтобы применить исключение, которое я получил:
Не удалось загрузить файл или сборку «MyImpl, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null» или одна из ее зависимостей. Системе не удается найти указанный файл. ":" MyImpl, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null "}
Я не в курсе. Я уже загрузил сборку в AppDomain, но Type.GetType (строка) не может найти ее, когда я указываю AQN.