• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ht

[Resolvido] Implementar plugins numa aplicação

7 mensagens neste tópico

boas,

dada uma aplicação em vb.net, keria expandi-la através de um suporte para plugins (se é assim k podemos chamar :hmm:).

sei que é possível fazer isso através do uso de interface, um dos conceitos de OO, pois ja vi alguns exemplos só que aplicados em C#, mas a minha dúvida

está em conseguir fazer para vb.

Se alguem puder ajudar nisto, agradecia.

fiquem bem

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para que possa ajudar terás que explicar bem melhor o que pretendes ....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas!  ;)

infelizmente devido ao tempo k a univ me ocupa, não tenho tido tempo para desenvolver umas aplicações pessoais... mas cá tou eu d novo.

desde a ultima vez que tive a programar em vb.net, tava fazer uma analise para um programa de webdesign, tipo um pouco o dreamweaver.. e como tal keria tornar a aplicação com suporte para plugins :hmm:, de forma a que kando kiser acrescentar funcionalidades, apenas escrevendo o codigo do plugin e instala-lo na aplicação.. por exemplo, para dar uma ideia mais concreta é o caso do firefox que tem possibilidade de instalar e usar extensoes expandindo assim o mesmo..

Agradeço desde ja a ajuda prestada.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por acaso eu também gostava de saber qual a melhor forma de fazer isto, quem der explicações por favor que seja de uma maneira geral para todas as linguagens com suporte a OOP

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"Por acaso eu também gostava de saber qual a melhor forma de fazer isto, quem der explicações por favor que seja de uma maneira geral para todas as linguagens com suporte a OOP".

Não é possivel para todas as linguagens com suporte para OOP, pois depende das nuances de cada linguagem.

Posso explicar como é possivel faze-lo para java ou .net.

basicamente faz-se uso de interfaces e implementam-se classes (plugins) que obedeçam a esse interface.

No caso do .NET , deve-se usar o namespace System.Reflection, para ler os plugins.

1.

Criar-mos uma classe interface do genero:

public interface IBasePlugin{
   string pluginName();
   string pluginDescription();
  void addParameter(object key, object value);
  object execute();
}

2.

Criamos  as DLL's que obedeçam ao interface.

Neste caso implemento uma classe plugin que apenas escreve no ecran (Hello World)

public class PluginHelloWorld : IBasePlugin{
  public PluginHelloWorld(){}

  public string pluginName(){
    return "HelloWorldPlugIn";
  }

  public string pluginDescription(){
   return "Este plugin só escreve a frase Hello World no ecran...";
  }

  public void addParameter(object key, object value){
     // Não são necessários parametros.
    return;
  }

  public object execute(){
    Console.WriteLine("Hello World");
    return null;
  }
}
}

Podemos criar (n) classes deste genero, desde que obedeçam ao interface.

Finalmente na nossa APP, "carregamos" as DLL'S  anteriores (depois de compiladas) com a ajuda do reflection.

3.

Criamos uma aplicação que leia de um directorio as DLL's , e instanciamo-las dinamicamente.


static void loadPlugins(){
       Assembly assembly= null;
       try { 
            // Directorio das DLL's Plugins... 
           AppDomain.CurrentDomain.AppendPrivatePath("PlugIns _Dlls"); 
          string path= AppDomain.CurrentDomain.BaseDirectory+"PlugIns_Dlls"; 
          DirectoryInfo info= new DirectoryInfo(path);
          if (!info.Exists)
              throw new Exception("Não existem DLL no directorio "+path);

          string[] dir= Directory.GetFiles(path,"*.dll"); 
          foreach (string s in dir){
               string dll= Path.GetFileNameWithoutExtension(s);
               if (!dll.Equals("InterfaceModule")){
                  assembly= Assembly.Load(dll); 
                 Type[] types= assembly.GetTypes();
                 foreach(Type t in types) { 
                   try { 
                     if (t.GetInterface("PlugInTutorial.Interfaces.IBasePlugin")!= null) {
                         object obj= Activator.CreateInstance(t);
                        if (!t.Name.Equals("PluginHelloWorld")) 
                           // Neste caso, se o plugin for a classe PluginToUpperCase, passamos um parametro.  VER PROJECTO EXEMPLO
                           ((PlugInTutorial.PlugIns.PluginToUpperCase )obj).addParameter("str","funcionou o ToUpperCase");
                         // ArrayList global, que armazena os plugins instanciados 
                        _PlugIns.Add(obj); 
                      }
                   }catch(Exception e) {
                      throw new Exception ("Erro no carregamento do plugin ..."+e.Message );
                  }
            }
        }
    }
}
catch(Exception e) 
{
throw new Exception ("Plugin Error "+e.Message );
} 

4.

Finalmente na APP, executamos um plugin .


...
object plg = _PlugIns[0];
object ret = ((PlugInTutorial.Interfaces.IBasePlugin )plg).execute() ;
if (ret!=null)
   Console.WriteLine(ret.ToString()) ;
...

podem fazer download do projecto exemplo atraves do link

http://bragatel.pt/coredump/PlugInTutorial.zip

O codigo é em c#, mas é trivial passa-lo para VB.

/ing

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado pela ajuda..  :D

foi-me mt util esse pequeno tutorial.. ajudou-me a perceber melhor como resolver o meu problema, apesar de saber k era atraves do uso de interfaces, mas não sabia implementar correctamente e n sabia como ler os plugins..

uma vez  + agradecido  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas, peço desculpa por desenterrar esta tread :) mas penso que não havia necessidade de criar outra uma vez que o tema é idêntico :P

além do que foi referido acima, é possível criar novos forms, butons, etc através de um plugin? alguém conhece um site ou assim que exemplifique isso de forma clara e simples, ou até criar um pequeno exemplo que me ajude um bocado? :)

cumps,

soulsick

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora