.NET实现插件功能的接口程序
现在好多程序都会有插件功能,确实插件功能给软件的使用者可以扩充软件功能的机会。我们不可能让软件适用于所有人,也不是所有的人都会出资帮助你实现他们的需求。插件功能提供了一个软件的高度可扩充性,允许用户作为软件的二次开发者,继续完善软件的功能。
为了在软件中加入插件功能,我们需要下面几个特别的条件:
(1) 本软件(此后我们称之为‘宿主程序’)需要开放自己的成员,包括属性、方法、事件为插件程序提供服务。
(2) 宿主程序要很好的隐藏一些信息,阻止插件程序有意或无意的破坏本身的功能。
(3) 宿主程序提供插件服务,方便插件功能的升级。
(4) 定义一个统一的标志信息,保证宿主程序可以正常的识别并运行插件程序而不会出现类型安全问题。
为此我们模仿Visual Studio .Net本身提供的Addin的实现机制来实现我们的插件程序。
第一步,制作接口。它是建立在宿主程序和插件之间的桥梁。
首先我们建立一个“插件标识”接口,这个接口用来标识我们的插件类的特性。
Public Interface IPlugins
Sub Connect(ByVal PluginsApp As IPluginsApplication)
End Interface
这个接口里面我们定义了一个方法Connect,用来启动我们的插件程序。也就是说,我们的宿主程序将会统一使用Connect方法启动插件程序。而对于插件程序,入口地址将是Connect方法。这个有点类似于普通应用程序的Main函数。Connect函数的参数IPluginsApplication表示我们宿主程序的实例,稍后将会进一步解释。
其次,我们建立一个“插件服务”接口,这个接口将宿主程序需要开放的属性、方法、实现定义出来,通过接口的方式提供给插件程序。
Public Interface IPluginsApplication
Event Display(ByVal sender As Object, ByVal e As EventArgs)
Property Caption() As String
Sub DisplayInput(ByVal TextAs String)
End Interface
在例子中我们简单定义了一个事件、一个属性和一个方法。插件程序在开发的时候只要引用了我们的“插件服务”接口就可以调用里面定义的内容了。
第二步,建立宿主程序。
但是光有接口是不能执行里面的内容的,必须要有一个实现了这个接口的实例才可以。这里我们让宿主程序实现这个接口,并且实现这些接口里面的内容,让插件程序可以进行操作。
Public Class Form1
Implements PluginsInterface.IPluginsApplication
Public Event Display(ByVal sender As Object, ByVal e As System.EventArgs) Implements PluginsInterface.IPluginsApplication.Display
Public Property Caption() As String Implements PluginsInterface.IPluginsApplication.Caption
Get
Return Me.Text
End Get
Set(ByVal value As String)
Me.Text = value
End Set
End Property
Public Sub DisplayInput(ByVal Text As String) Implements PluginsInterface.IPluginsApplication.DisplayInput
MsgBox("输入内容:" & Text)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
RaiseEvent Display(Me, New EventArgs)
Me.DisplayInput(Me.TextBox1.Text)
End Sub
End Class
我们用一个标准的Windows窗体来实现“插件服务”接口的内容。通过Caption属性可以更改窗体的标题,通过DisplayInput方法可以显示字符串。
这样我们的宿主程序由于实现了“插件服务”接口,就可以通过“插件服务”接口来将实例传递进插件程序。我们回到“插件标识”接口的Connect方法,插件的入口函数参数将宿主程序通过“插件服务”接口的实例传递到插件程序内,使得插件程序可以调用宿主程序开放的内容。而且由于通过接口传递,这些操作都是类型安全的。