.Net实现程序的插件机制
使用asp.net或vb.net或C#.net均可以实现插件的功能,插件的作用是对系统的后期未知扩展预留快速升级的空间!插件开发完成后将以DLL的形式发布到特定的文件夹中,例如主程序文件夹是D:\myApp\myApp.exe,我们可以在D:\myApp中定义文件夹D:\myApp\Plus目录来存放插件。
在程序中通过遍历该文件夹中的所有DLL检测符合预定接口的插件来实现动态装载相应的功能模块!
下面举例:
一、定义接口
新建解决方案用于生成此接口
2 Public Interface IPlugin
3 Property MovementID() As Integer
4 Property MovementName() As String
5 Property ReTryMinute() As Integer
6 Property ConnectionString() As String
7 Event RaiseLog(ByVal log As String)
8 Sub Init()
9 End Interface
10 End Class
11
二、编写继承自该接口的自定义组件(将编译成DLL)
该操作您需要新建一个解决方案
Imports System.Data2
Imports System.Data.SqlClient3
Imports System.Net4
Imports System.IO5
Imports na7Interface.IPlugin6

7
Public Class recv8

9
Implements IPlugin '实现此接口10

11
'构造属性变量12
Private _MovementID As Integer = 2713
Private _MovementName As String = "51麦克疯"14
Private _SpanMinute As Integer = 3015
Private _ConnectionString As String = ""16

17
Private Fir As String = "活动:" + MovementName + "(" + MovementID.ToString + ")"18

19
''' <summary>20
''' 返回内部处理的消息,实现接口中的RaiseLog事件。21
''' </summary>22
''' <param name="logText"></param>23
''' <remarks></remarks>24
Public Event RaiseMyEvent(ByVal logText As String) Implements IPlugin.RaiseLog25

26
''' <summary>27
''' 调用此方法!28
''' </summary>29
''' <remarks></remarks>30
Public Sub Init() Implements IPlugin.Init '继承自接口的Init方法。31
'这里放置数据抓取及相关的处理程序。32
'实际应用中要根据您的程序何时调用Init决定,这不是必须的方法33
ResultText("处理完成!")34
End Sub35

36
Private Sub SaveSetups(ByVal savedate As String, ByVal UserID As String, ByVal WebId As String, ByVal Setups As String)37
'定义该内部方法,这个方法不实现任何接口中的方法。因此只在本类内部实现。38
Dim CmdText As String = ""39
End Sub40

41
''' <summary>42
''' 返回八位数字的日期格式43
''' </summary>44
''' <param name="dt"></param>45
''' <returns></returns>46
''' <remarks></remarks>47
Private Function ClongDate(ByVal dt As Date) As String '同上48
Dim mm As String = dt.Month.ToString49
If mm.Length = 1 Then mm = "0" + mm50
Dim dd As String = dt.Day.ToString51
If dd.Length = 1 Then dd = "0" + dd52
Return dt.Year.ToString + "" + mm + dd53
End Function54

55
Private Function ConvDate(ByVal dt As Long) As String '同上56
Dim YY As String = Mid(dt.ToString, 1, 4)57
Dim MM As String = Mid(dt.ToString, 5, 2)58
Dim DD As String = Mid(dt.ToString, 7, 2)59
Return YY + "-" + MM + "-" + DD + " 00:00:00"60
End Function61

62
''' <summary>63
''' 获得此组件处理的活动ID,该属性实现了接口IPlugin的MovementID属性。64
''' </summary>65
''' <value></value>66
''' <returns></returns>67
''' <remarks></remarks>68
Public Property MovementID() As Integer Implements IPlugin.MovementID69
Get70
Return _MovementID71
End Get72
Set(ByVal value As Integer)73
_MovementID = value74
End Set75
End Property76

77
''' <summary>78
''' 获得此组件的活动名称,同上79
''' </summary>80
''' <value></value>81
''' <returns></returns>82
''' <remarks></remarks>83
Public Property MovementName() As String Implements IPlugin.MovementName84
Get85
Return _MovementName86
End Get87
Set(ByVal value As String)88
_MovementName = value89
End Set90
End Property91

92
''' <summary>93
''' 获得此组件定时调用的间隔分钟数,实现自定义属生ReTryMinute94
''' </summary>95
''' <value></value>96
''' <returns></returns>97
''' <remarks></remarks>98
Public Property SpanMinute() As Integer Implements IPlugin.ReTryMinute99
Get100
Return _SpanMinute101
End Get102
Set(ByVal value As Integer)103
_SpanMinute = value104
End Set105
End Property106

107
Public Property ConnectionString() As String Implements IPlugin.ConnectionString108
Get109
Return _ConnectionString110
End Get111
Set(ByVal value As String)112
_ConnectionString = value113
End Set114
End Property115

116
Public Sub ResultText(ByVal txt As String)117
'响应事件118
RaiseEvent RaiseMyEvent(txt)119
End Sub120
End Class121

三、在程序中调用定义的接口
注意:程序中定义接口编译生成的DLL必须使用同一个,否则如果不是使用相同的DLL,即使DLL的内容相同,同样也会产生错误。
这里有本人2007年底花四个月时间写成的进销存系统,里面使用了插件机制生成的报表设计管理器,但没有使用到接口,而是预先定义好调用的方法。
http://www.newhua.com/soft/33504.htm
补充:回复里有朋友说到,无法卸载的问题,现在提供如何卸载的方法:
'获得此文件信息及此组件的入口类名称与
Dim Ref As Assembly
Ref = Assembly.LoadFrom(file)
'请将上面的代码,改为下面的代码,原理是将DLL文件以字节读取,这样即不存在DLL锁定的问题,因为就不需要释放。
Dim Ref As Assembly
Dim assemblyInfo() As Byte = IO.File.ReadAllBytes(FilePath)
Ref = Assembly.Load(assemblyInfo)


浙公网安备 33010602011771号