📄 pluginservice.vb
字号:
'//////////////////////////////////////////////////////////////////////////
'// Use at your own risk //
'// www.hesicong.net //
'// Copyright Dreamworld. You can use this program freely but no in //
'// commerial use without my permission. //
'// Authoer: hesicong //
'// Date: 2007-2-25 //
'//////////////////////////////////////////////////////////////////////////
Imports System.IO
Imports System.Reflection
Imports System.Collections
Imports Dreamworld.Mobile.PhoneControllerSDK
Public Class PluginServices
Public Structure AvailablePlugin
Public AssemblyPath As String
Public ClassName As String
End Structure
''' <summary>
''' Find a plug-in with given interface name.
''' </summary>
''' <param name="strPath">Path to search. Subdirs will not search.</param>
''' <param name="strInterface">Interface name</param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function FindPlugins(ByVal strPath As String, ByVal strInterface As String) As AvailablePlugin()
Dim Plugins As ArrayList = New ArrayList()
Dim strDLLs() As String, intIndex As Integer
Dim objDLL As [Assembly]
'Go through all DLLs in the directory, attempting to load them
strDLLs = Directory.GetFileSystemEntries(strPath, "*.dll")
For intIndex = 0 To strDLLs.Length - 1
Try
objDLL = [Assembly].LoadFrom(strDLLs(intIndex))
ExamineAssembly(objDLL, strInterface, Plugins)
Catch e As Exception
'Error loading DLL, we don't need to do anything special
End Try
Next
'Return all plugins found
Dim Results(Plugins.Count - 1) As AvailablePlugin
If Plugins.Count <> 0 Then
Plugins.CopyTo(Results)
Return Results
Else
Return Nothing
End If
End Function
Private Shared Sub ExamineAssembly(ByVal objDLL As [Assembly], ByVal strInterface As String, ByVal Plugins As ArrayList)
Dim objType As Type
Dim objInterface As Type
Dim Plugin As AvailablePlugin
'Loop through each type in the DLL
For Each objType In objDLL.GetTypes
'Only look at public types
If objType.IsPublic = True Then
'Ignore abstract classes
If Not ((objType.Attributes And TypeAttributes.Abstract) = TypeAttributes.Abstract) Then
'See if this type implements our interface
objInterface = objType.GetInterface(strInterface, True)
If Not (objInterface Is Nothing) Then
'It does
Plugin = New AvailablePlugin()
Plugin.AssemblyPath = objDLL.Location
Plugin.ClassName = objType.FullName
Plugins.Add(Plugin)
End If
End If
End If
Next
End Sub
Public Shared Function CreateInstance(ByVal Plugin As AvailablePlugin) As Object
Dim objDLL As [Assembly]
Dim objPlugin As Object
Try
'Load dll
objDLL = [Assembly].LoadFrom(Plugin.AssemblyPath)
'Create and return class instance
objPlugin = objDLL.CreateInstance(Plugin.ClassName)
Catch e As Exception
Return Nothing
End Try
Return objPlugin
End Function
''' <summary>
''' Select plugin from Model ID
''' </summary>
''' <param name="ap">AvaliablePlugin</param>
''' <param name="baudrate">Speed</param>
''' <param name="port">Port name like "COM1:"</param>
''' <param name="CommPhoneClassName">The name of commphone class.</param>
''' <returns>Plugin number in AvialiablePlugin</returns>
''' <remarks></remarks>
Public Shared Function SelectPlugin(ByVal port As String, ByVal baudrate As Integer, ByVal ap As PluginServices.AvailablePlugin(), ByVal CommPhoneClassName As String) As Integer
If ap Is Nothing Then
Throw New Exception("Not plugin found")
End If
Dim ModelID As String = String.Empty
'Find commbase class and get modelID
For i As Integer = 0 To ap.Length - 1
If ap(i).ClassName = CommPhoneClassName Then
Dim objPlugin As IPhoneController
objPlugin = DirectCast(PluginServices.CreateInstance(ap(i)), IPhoneController)
With objPlugin
.Connect(port, baudrate, 1000)
.SetStandard()
ModelID = .GetModelID()
Console.WriteLine("Find a phone :" & ModelID)
.Disconnect()
End With
End If
Next
'Loop every plugin to find supported device.
For i As Integer = 0 To ap.Length - 1
Dim objPlugin As IPhoneController
objPlugin = DirectCast(PluginServices.CreateInstance(ap(i)), IPhoneController)
Dim supportedModel As String() = objPlugin.SupportedModel
For j As Integer = 0 To supportedModel.Length - 1
If ModelID = supportedModel(j) Then
Return i
End If
Next
Next
'If not found
Throw New NotSupportedException("Your phone are not supported")
End Function
''' <summary>
''' Search phone automatically on all avaiable port
''' </summary>
''' <param name="ap">Available Plugins</param>
''' <param name="index">Index of plug-in</param>
''' <param name="portName">Port name</param>
''' <returns>True if successed;False if failed.</returns>
''' <remarks></remarks>
Public Shared Function AutoSearch(ByVal ap As PluginServices.AvailablePlugin(), ByRef portName As String, ByRef index As Integer) As Boolean
Dim ports As String() = System.IO.Ports.SerialPort.GetPortNames
Dim baudrate As Integer = 19200
For Each aPort As String In ports
Try
aPort = "COM" & Val(aPort.Substring(3)).ToString
Console.WriteLine("Trying to connect on {0}", aPort)
index = SelectPlugin(aPort, baudrate, ap, "Dreamworld.Mobile.CommPhone")
portName = aPort
Return True
Catch e As Exception
Console.WriteLine(" Failed: {0}", e.Message)
End Try
Next
Return False
End Function
End Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -