Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как загрузить плагины в .NET?
Я хотел бы предоставить некоторый способ создания динамически загружаемых плагинов в моем программном обеспечении. Типичный способ сделать это-использовать функцию LoadLibrary WinAPI для загрузки dll и вызова GetProcAddress , чтобы получить указатель на функцию внутри этого dll.
Мой вопрос заключается в том, как мне динамически загрузить плагин в приложении C#/.Net?
По состоянию на .NET 3.5 существует формализованный, запеченный способ создания и загрузки плагинов из приложения .NET. Все это находится в пространстве имен System.AddIn. Для получения дополнительной информации вы можете проверить эту статью на MSDN: надстройки и расширяемость
Следующий фрагмент кода (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);
}
}
}
Edit: классы, на которые ссылается Мэтт , вероятно, являются лучшим вариантом в .NET 3.5.
Динамическая загрузка плагинов
Дополнительные сведения о динамической загрузке сборок .NET см. В этом вопросе (и моем ответе ). Вот некоторый код для загрузки создания AppDomain и загрузки в него assembly.
var domain = AppDomain.CreateDomain("NewDomainName");
var pathToDll = @"C:\myDll.dll";
var t = typeof(TypeIWantToLoad);
var runnable = domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName)
as IRunnable;
if (runnable == null) throw new Exception("broke");
runnable.Run();
Разгрузка плагинов
Типичное требование платформы плагинов-выгрузка плагинов. Для выгрузки динамически загружаемых сборок (например, плагинов и надстроек) необходимо выгрузить содержащийся AppDomain . Для получения дополнительной информации смотрите эту статью о MSDN при разгрузке AppDomains .
Использование WCF
Существует вопрос переполнения стека и ответ , которые описывают, как использовать коммуникационную платформу Windows (WCF) для создания платформы подключаемого модуля.
Существующие платформы плагинов
Я знаю о двух подключаемых фреймворках:
- Mono.Add-ins - как уже упоминалось в этом ответе на другой вопрос .
- Управляемая надстройка Framework (MAF) - это пространство имен
System.AddIn, упомянутое Мэттом в своем ответе .
Некоторые люди говорят о платформе управляемой расширяемости (MEF) как о плагине или надстройке, но это не так. Для получения дополнительной информации см. Этот вопрос StackOverflow.com и этот вопрос StackOverflow.com .
Один совет-загрузить все плагины и подобные им в собственный AppDomain, так как запущенный код может быть потенциально вредоносным. Собственный AppDomain также можно использовать для "filter" сборок и типов, которые вы не хотите загружать.
AppDomain domain = AppDomain.CreateDomain("tempDomain");
И загрузить assembly в домен приложения:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(assemblyPath);
Assembly assembly = domain.Load(assemblyName);
Чтобы выгрузить домен приложения:
AppDomain.Unload(domain);
Да, ++ к Мэтту и System.AddIn (две части статьи журнала MSDN о System.AddIn доступны здесь и здесь ). Еще одна технология, которую вы можете рассмотреть, чтобы получить представление о том, куда может пойти платформа .NET в будущем, - это управляемая платформа расширяемости , доступная в настоящее время в форме CTP на Codeplex.
В принципе, вы можете сделать это двумя способами.
Первый-импортировать 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-способ: с помощью отражения. Проверьте пространство имен System.Reflection и следующие методы:
Сначала вы загружаете assembly по его пути, затем получаете тип (класс) от него по его имени, затем снова получаете метод класса по его имени и, наконец, вызываете метод с соответствующими параметрами.
Эта статья немного старше, но все еще применима для создания слоя расширяемости в вашем приложении:
Пусть пользователи добавляют функциональность к вашим .NET приложениям с помощью Macros и плагинов