運用 interface 與 DLL 動態聯結的運用 最大的好處是 當DLL 更新的時候 整個程式不需要重新編譯就可以直接使用
這用在 DLL 更新時是一個很方便的地方
但有個先決條件, Interface 必須先定義好,因為如果後續要增加 任何的 sub Function 也是一樣必須重新編譯
Interface
首先建立一個 專案(類別庫) 進到程式碼編輯模式,將 Class 改成 Interface
在 Interface 中可以先預定好 要使用的 sub Function Event 甚至 Class
(再來到專案屬性設定 將 根命名空間 改成 nThickness 此部分可以不改在後面導入時只要清楚是哪個 Namespace 就可以)
Public Interface iThickness
Sub Measure(ByVal Model As String) '呼叫量測功能
Sub Result() '取得上一次量側的結果
Event ReportStateEvent(ByVal sander As Object, ByVal e As EventArgs) '事件 回報目前狀態
Event ReportModelListEvent(ByVal sander As Object, ByVal e As EventArgs) '事件 啟動回報取得的 Model
''' <summary>
''' 膜厚的值
''' </summary>
''' <remarks></remarks>
Class cThickness
Public MeasoureList As New List(Of String) '量測的值
Public ParameterList As New List(Of String) '量測的參數名稱
End Class
End InterFace
Class
建立 要由 Interface 來導入的 Class, 在 方案中直接新增一個 類別庫 專案
再來參考 直接參考剛剛建立 Interface 的專案( 測試中 參考專案就可以,但正式使用 最好是將 Interface 的專案編譯成 DLL,在這參考這DLL)
在Class 中繼承上面的 Interface
當繼承後會自動把 Interface 定義好的 Sub Function Event 都自懂導入,省去自行Key程式的時間,當然 裡面的程式碼都是空的
(如果可以有自行產生要的程式碼 多好........................)
Imports nThickness
Public Class cHoribaSE
Implements nThickness.iThickness
(省略)...............................
End Class
Process
再來 就是重頭戲了,首先在要當主程式參考 Interface 的專案或Dll
一樣在程式碼 Import 專案
Dim HoribaSE As nThickness.iThickness '在這邊宣告一個 Interface 準備拿來作連接使用
Dim asmFile As String = Application.StartupPath + "\Resources\cHoribaSE.dll" '要導入Dll 的路徑
Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom(asmFile) '要來導入的 DLL 的工具 與程式寫法
Try
HoribaSE = DirectCast(System.Activator.CreateInstance(asm.GetType("cHoribaSE.cHoribaSE")), nThickness.iThickness)
AddHandler HoribaSE.ReportStateEvent, AddressOf GetSEMessage '取得 SE 回報
AddHandler HoribaSE.ReportModelListEvent, AddressOf GetNewSERecipe '取得 SE Model
Catch ex As Exception
Msgbox("無法連線 SE Server", ex.ToString)
End Try
重點就在上面Mark 起來的這一行
後面 GetType 這個部分
"cHoribaSE.cHoribaSE" <-- 代表 Namespace.Class 就是上面建立的Class 的 根命名空間.Class
nThickness.iThickness <-- 代表 Namespace.Class 也就是上面一開始建立的 Interface 專案的 Namespace.Class
如此 就可以在主程式開始使用 動態導入的物件
- 10月 13 週四 201123:07
Interface 與 DLL 動態聯結運用
