Imports System.Reflection
Imports System.Activator
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim dllPath As String = "DLL名稱"
’導入DLL
Dim a As Assembly = Assembly.LoadFrom(dllPath)
Dim key As String = "命名空間" + "." + "類名"
'獲取類的類型
Dim b As Type = a.GetType(key)
‘根據獲取的類生成這個類的一個實例
Dim c As Object = Activator.CreateInstance(b)
Dim methodname As String = "方法名"
’根據獲取的類,得到指定方法的信息
Dim d As MethodInfo = b.GetMethod(methodname)
'調用方法執行
d.Invoke(c, New Object() {"參數1", "參數2"})
End Sub
End Class
利用反射機制可以實現根據讀取的外部配置文件(配置文件中要記錄以下信息:調用的DLL名稱,DLL中類的命名空間,類名,方法名,方法的參數)的形式,對於程序運行中的實際執行語句進行定製,從而實現高度的邏輯可變。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.net和com組件的互操作問題,請參見Visual basic 2008高級編程介紹,裏面有一章內容寫的很好,很全;從來不要試圖去懷疑VB這門編程語言的劣勢!
‘通過ProgID返回COM對象類型
dim comType as type = type.GetTypeFromProgID(
"工程名.類名"
)
’通過CLSID返回COM對象類型
‘dim clsid as Guid= new Guid("例如:270B58ED-DDCB-4E2E-A7A5-D1998016A36D")
’dim comType as type
= Type.GetTypeFromCLSID(clsid)
‘創建COM對象實例
dim comObj as Object= Activator.CreateInstance(comType)
’設置參數
dim paras as Object()= { 3, 8 }
‘調用方法Add
dim result as Object= comType.InvokeMember(
"方法名"
, BindingFlags.InvokeMethod,
nothing
, comObj, paras);