2010-08-24 4 views
1

J'utilise le code suivant dans un projet vb.net 2008 pour charger dynamiquement dll (avec des formulaires) à partir d'un dossier, tout fonctionne très bien mais je ne peux pas comprendre pour la vie de moi comment appeler une fonction ou obtenir une variable publique à partir des plugins.vb.net dynamic plugin chargement question

Quelqu'un peut-il répondre à ce problème?

Dim PluginList As String() = Directory.GetFiles(appDir, "*.dll") 

For Each Plugin As String In PluginList 

    Dim Asm As Assembly 
    Dim SysTypes As System.Type 
    Asm = Assembly.LoadFrom(Plugin) 
    SysTypes = Asm.GetType(Asm.GetName.Name + ".frmMain") 
    Dim IsForm As Boolean = GetType(Form).IsAssignableFrom(SysTypes) 
    If IsForm Then 
      Dim tmpForm As Form = CType(Activator.CreateInstance(SysTypes), Form) 

Répondre

1

Vous devriez probablement créer une interface dans une assemblée commune et votre forme mettre en œuvre, de cette façon, vous pouvez vous jeter objet chargé dynamiquement comme type d'interface.

Imports System.Reflection 
Imports Plugin.Interfaces 

Sub Main() 
    Dim assembly As Assembly 
    assembly = assembly.LoadFrom("Plugin.X.dll") 

    Dim type As Type 
    Dim found As Boolean = False 

    For Each type In assembly.GetTypes() 
     If GetType(IForm).IsAssignableFrom(type) Then 
      found = True 
      Exit For 
     End If 
    Next 

    If found Then 
     Dim instance As IForm 
     instance = CType(Activator.CreateInstance(type), IForm) 

     Console.WriteLine(instance.Add(20, 20)) 
    End If 
End Sub 

Assemblée Interface

Public Interface IForm 
    Function Add(ByVal x As Integer, ByVal y As Integer) As Integer 
End Interface 

Assemblée Plugin

Imports Plugin.Interfaces 

Public Class Form 
    Implements IForm 

    Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer Implements IForm.Add 
     Return x + y 
    End Function 

End Class 
+0

Cela m'a mis sur la bonne voie, merci! – Joe