2010-08-24 56 views
1

我在vb.net 2008项目中使用下面的代码动态加载dll的(与表单)从一个文件夹中,所有的伟大的作品,但我无法弄清楚的生活我如何调用一个函数或从插件获取一个公共变量。vb.net动态插件加载问题

任何人都可以回答这个问题吗?

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) 

回答

1

你或许应该建立在一个共同的组件,接口,让您的形式实现它,这样就可以施放动态加载的对象作为你的接口类型。

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 

接口组件

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

插件大会

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

这让我在正确的道路上,谢谢! – Joe 2010-08-24 22:28:18