運用 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




如此  就可以在主程式開始使用  動態導入的物件