C# После загрузки dll библиотеки через метод выдает ошибку при попытке вызова ее методов
C# После загрузки dll библиотеки через метод выдает ошибку при попытке вызова ее методов: Ссылка на объект не указывает на экземпляр объекта
Есть следующий метод для загрузки dll плагинов:
public List<IBookFormatPlugin> LoadPlugins(string pluginsDirectory)
{
List<IBookFormatPlugin> plugins = new List<IBookFormatPlugin>();
// Получение всех файлов .dll из папки pluginsDirectory
string[] dllFiles = Directory.GetFiles(pluginsDirectory, "*.dll");
foreach (string dllFile in dllFiles)
{
try
{
// Загрузка сборки
Assembly pluginAssembly = Assembly.LoadFrom(dllFile);
string pluginName = pluginAssembly.GetName().Name;
Console.WriteLine($"Имя сборки DLL: {pluginName}");
// Получение версии сборки
Version version = pluginAssembly.GetName().Version;
Console.WriteLine($"Версия: {version}");
object[] titleAttributes = pluginAssembly.GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
if (titleAttributes.Length > 0)
{
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)titleAttributes[0];
Console.WriteLine($"Название: {titleAttribute.Title}");
}
object[] descriptionAttributes = pluginAssembly.GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
if (descriptionAttributes.Length > 0)
{
AssemblyDescriptionAttribute descriptionAttribute = (AssemblyDescriptionAttribute)descriptionAttributes[0];
Console.WriteLine($"Описание: {descriptionAttribute.Description}");
}
string iMyInterfaceName = typeof(IBookFormatPlugin).ToString().Substring(6);
Type[] defaultConstructorParametersTypes = Array.Empty<Type>();
object[] defaultConstructorParameters = Array.Empty<object>();
foreach (Type type in pluginAssembly.GetTypes())
{
string ns = type.Namespace;
if (type.GetInterface(ns + iMyInterfaceName) != null)
{
Console.WriteLine(type.Name);
ConstructorInfo defaultConstructor = type.GetConstructor(defaultConstructorParametersTypes);
object instance = defaultConstructor.Invoke(defaultConstructorParameters);
plugins.Add(instance as IBookFormatPlugin);
}
}
}
catch (Exception ex)
{
// Обработка ошибок загрузки плагина
Console.WriteLine($"Ошибка загрузки плагина из файла {dllFile}: {ex.Message}");
}
}
return plugins;
}
При добавлении элемента в список выходит нулевое значение:
Потом я вызываю метод:
public static string OpenBookFilter(List<IBookFormatPlugin> plugins)
{
StringBuilder sb = new StringBuilder();
string booksFormat = "Книги формата FB2 | *.fb2";
sb.Append(booksFormat);
foreach (IBookFormatPlugin plugin in plugins)
{
if (!string.IsNullOrEmpty(plugin.FilterFormat()))
{
sb.Append("|" + plugin.FilterFormat());
}
}
sb.Append("|Все файлы (*.*)|*.*");
return sb.ToString();
}
И выпадает ошибка: "Ссылка на объект не указывает на экземпляр объекта"
Подскажите в чем ошибка? Лучше по другому обрабатывать библиотеки?
UPD: Вот код моей библиотеки:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using VersOne.Epub;
namespace epubPlugin
{
public class epubReader : IBookFormatPlugin
{
public bool CanReadFormat(string filePath)
{
if (Path.GetExtension(filePath).ToLower() == ".epub")
{
return true;
}
else
{
return false;
}
}
public string FilterFormat()
{
return "Книги формата EPUB | *.epub";
}
public Book InfoBook(string filePath)
{
EpubBook book = EpubReader.ReadBook(filePath);
Book book1 = new Book();
FileInfo fileInfo = new FileInfo(filePath);
book1.Authors = book.AuthorList.Any() ? string.Join(", ", book.AuthorList) : "Неизвестный";
if (!string.IsNullOrWhiteSpace(book.Title))
book1.Title = book.Title;
else
book1.Title = Path.GetFileNameWithoutExtension(filePath).Trim();
book1.Annotation = book.Description;
book1.LocalPath = book.FilePath;
book1.Size = Math.Round(fileInfo.Length / 1048576.0, 2);
book1.Format = Path.GetExtension(filePath);
book1.AddedDate = File.GetCreationTime(filePath);
book1.Genre = string.Empty;
book1.Year = string.Empty;
book1.Language = string.Empty;
book1.Sequence = (0,string.Empty);
if (book.CoverImage != null)
{
byte[] imageBytes = book.CoverImage;
File.WriteAllBytes(Path.GetDirectoryName(filePath) + "cover.jpg", imageBytes);
book1.CoverImage = Path.GetDirectoryName(filePath) + "cover.jpg";
}
else
book1.CoverImage = null;
return book1;
}
public string ReadBook(string filePath)
{
throw new NotImplementedException();
}
}
}
Также код интерфейса:
namespace course
{
public interface IBookFormatPlugin
{
bool CanReadFormat(string filePath);
Book InfoBook(string filePath);
string ReadBook(string filePath);
string FilterFormat();
}
}
Ссылка на проект на гитхабе: https://github.com/KRupos/course