Я пытаюсь добавить плагины к моей программе, и это выглядит хорошо, за исключением того, что я не могу привести правильный тип из библиотеки DLL.
У меня есть решение с несколькими проектами на нем.
Одним из проектов является слой страны, который фактически содержит CountryBase (определяется как открытый абстрактный класс CountryBase: CountryLayers.ICountryBase)
Интерфейс (открытый интерфейс ICountryBase)
По другому проекту у меня есть «Реализация» для страны. Эта DLL загружается во время выполнения, используя это:
Assembly assembly = Assembly.LoadFrom(file);
//get the class from the assembly
foreach (Type t in assembly.GetTypes())
{
//just for debugging
Console.WriteLine(t.FullName);
}
Type localType = assembly.GetType( "CountryLayers.Local");
if (localType != null)
{
Country countrydata = new Country();
countrydata.ObjectType = localType;
countrydata.CountryObject = Activator.CreateInstance(localType);
countrydata.CountryObject2 = (CountryBase) countrydata.CountryObject;
countrydata.FileName = file;
CountryList.Add(countrydata);
}
Где Local - это имя класса, определенного как открытый класс Local: CountryLayers.CountryBase, CountryLayers.ICountryBase
countrydata просто содержит указатель. CountryObject2 определяется как CountryBase (я также пытался использовать IcountryBase). Но всегда возвращалось, что тип не конвертируемый.
Консольный писатель показал, что в сборку загружены все классы, принадлежащие к уровню страны, а также локальный класс.
Итак, на данный момент я не знаю, произошла ли ошибка из-за того, что у меня все в одном решении, или проблема в том, что я использую интерфейс и абстрактный класс в неправильном порядке. Кроме того, когда create instance возвращает объект, этот объект имеет все свойства, определенные в абстрактном классе, но не имеет метода.