Как загрузить плагины в.NET?

Я пытался переустановить HAXM несколько раз, но продолжал получать ошибки.

В моем случае мне действительно нужно было войти в настройки Bios и включить виртуализацию.

Это сработало для меня. На всякий случай это помогает кому угодно.

26
задан Benjamin 7 December 2013 в 18:06
поделиться

6 ответов

Следующий фрагмент кода (C#) создает экземпляр любых реальных классов, полученных от Base найденный в библиотеках классов (*.dll) в пути приложения, и хранит их в списке.

using System.IO;
using System.Reflection;

List<Base> objects = new List<Base>();
DirectoryInfo dir = new DirectoryInfo(Application.StartupPath);

foreach (FileInfo file in dir.GetFiles("*.dll"))
{
    Assembly assembly = Assembly.LoadFrom(file.FullName);
    foreach (Type type in assembly.GetTypes())
    {
        if (type.IsSubclassOf(typeof(Base)) && type.IsAbstract == false)
        {
            Base b = type.InvokeMember(null,
                                       BindingFlags.CreateInstance,
                                       null, null, null) as Base;
            objects.Add(b);
        }
    }
}

Редактирование: классы, упомянутые Matt, вероятно, более оптимальный вариант в.NET 3.5.

20
ответ дан Community 28 November 2019 в 06:28
поделиться

С.NET 3.5 существует формализованный, испеченный - способом создать и загрузить плагины из приложения.NET. Это - все в Система. Пространство имен AddIn . Для получения дополнительной информации можно проверить эту статью о MSDN: Дополнения и Расширяемость

28
ответ дан Matt Hamilton 28 November 2019 в 06:28
поделиться

Одна подсказка должна загрузить все плагины и такой в собственный AppDomain, так как выполнение кода может быть потенциально злонамеренным. Собственный AppDomain может также использоваться, чтобы "отфильтровать" блоки и типы, которые Вы не хотите загружать.

AppDomain domain = AppDomain.CreateDomain("tempDomain");

И загрузить блок в домен приложения:

AssemblyName assemblyName = AssemblyName.GetAssemblyName(assemblyPath);
Assembly assembly = domain.Load(assemblyName);

Для разгрузки домена приложения:

AppDomain.Unload(domain);
5
ответ дан Patrik Svensson 28 November 2019 в 06:28
поделиться

Да, ++ Matt и Системе. AddIn (статья MSDN Magazine с двумя частями о Системе. AddIn доступны здесь и здесь ). Другая технология, на которую Вы могли бы хотеть посмотреть понять, где Платформа.NET могла бы входить в будущее, Управляемая Платформа Расширяемости в настоящее время доступна в форме CTP на Codeplex.

4
ответ дан Jason Olson 28 November 2019 в 06:28
поделиться

В основном можно сделать это двумя способами.

первое должно импортировать kernel32.dll и использовать LoadLibrary и GetProcAddress, когда Вы использовали его прежде:

[DllImport("kernel32.dll")]

internal static extern IntPtr LoadLibrary(String dllname);

[DllImport("kernel32.dll")]

internal static extern IntPtr GetProcAddress(IntPtr hModule, String procname);

второе должно сделать это в пути.NET: при помощи отражения. Система контроля. Пространство имен отражения и следующие методы:

First, Вы загружаете блок, он - путь, затем получите тип (класс) от него, он - имя, затем получите метод класса, он - имя снова, и наконец назовите метод с соответствующими параметрами.

3
ответ дан Biri 28 November 2019 в 06:28
поделиться

Статья является немного более старой, но все еще применимой для создания слоя расширяемости в рамках Вашего приложения:

Пользователи, которым Позволяют, Добавляют Функциональность к Вашим Приложениям.NET с Макросами и Плагинами

2
ответ дан Brian G Swanson 28 November 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: