It Devel Carregando e utilizando plug-ins em C#
Post
Cancel

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.

[sourcecode language="csharp"]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;
}[/sourcecode]

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

[sourcecode language="csharp"]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);
}[/sourcecode]

A interface utilizada foi

[sourcecode language="csharp"]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;
}
}
[/sourcecode]

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