Carregando e utilizando plug-ins em C#

Este post demonstra como criar uma aplicação em C# que possibilite a interação com plug-ins. O método demonstrado é bastante simples e poderoso.

Este método realiza os seguintes passos:

  • Lista todas as Dlls em um diretório (plugins)
  • Carrega todos os assemblies deste diretório
  • Verifica se o tipo do assembly é o desejado
  • Cria a instancia do tipo que implementa e armazena em uma lista

Para realizar todos os itens acima o seguinte método genérico lista qualquer interface existente no diretório plugins, veritica o tipo desejado e cria uma lista de casos de todos os tipos que implementam a interface plugin.

using System;
using System.Reflection;
using System.Collections.Generic;
using System.IO;

public static List<T> GetPlugins<T>(string folder)
{
	string[] files = Directory.GetFiles(folder, "*.dll");
	List<T> tList = new List<T>();

	foreach (string file in files)
	{
		try
		{
			Assembly assembly = Assembly.LoadFile(file);
			foreach (Type type in assembly.GetTypes())
			{
				if (!type.IsClass || type.IsNotPublic) continue;
				Type[] interfaces = type.GetInterfaces();
				if (((IList<Type>)interfaces).Contains(typeof(T)))
				{
					object obj = Activator.CreateInstance(type);
					T t = (T)obj;
					tList.Add(t);
				}
			}
		}
		catch (Exception ex)
		{
			Console.WriteLine("Erro: " + ex.Message);
		}
	}

	return tList;
}

Com este método, podemos escrever um código para mostrar a lista de plugins com sua descrição da seguinte forma

string folder = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Plugins");
List list = GetPlugins(folder);

foreach (ITestInterface ti in list)
{
	string name = ti.GetPluginName();
	string desc = ti.GetPluginDescription();
	string str = string.Format("{0}, {1}, {2}",
	ti.GetType().FullName, name, desc);
	Console.WriteLine(str);
}

A interface utilizada foi

using System;

namespace PluginTest
{
    public delegate void TestEvent(object sender, EventArgs args);
    public interface ITestInterface
    {
        // Informacoes do plugin
        string GetPluginName();
        string GetPluginDescription();

        void PrintText(String text);
        void Reset();

        event TestEvent Motion;
    }
}

Fonte: http://blogs.msdn.com/b/abhinaba/archive/2005/11/14/492458.aspx

Helvio Junior (OSCE, OSCP, CEHv9)

Cyber Security Analyst em Banco Original
OSCE, OSCP, CEHv9, Pesquisador de Falhas de Segurança e Vulnerabilidades. Profissional com mais de 20 anos de experiência na área de TI, atualmente focado na área de segurança da informação ofensiva (Red Team), bug hunting, cyber threat hunting, criação e engenharia reversa de Malware.
Carreira baseada em sólidos conhecimentos técnicos nas principais tecnologias de TI: Penetration Testing, Clould Computing, Ambiente de alta criticidade e alta disponibilidade, Windows Servers e seus serviços, Linux Servers e seus serviços, VoIP com Asterisk, Redes, Cisco, HP, ISO 27002, Hacker ético (CEHv9) e Engenharia reversa.
Helvio Junior (OSCE, OSCP, CEHv9)
0 respostas

Deixe uma resposta

Want to join the discussion?
Feel free to contribute!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *