diff --git a/ComputingServices/ComputingServices.vbproj b/ComputingServices/ComputingServices.vbproj index 5da91ba..ca77106 100644 --- a/ComputingServices/ComputingServices.vbproj +++ b/ComputingServices/ComputingServices.vbproj @@ -231,6 +231,7 @@ True + diff --git a/ComputingServices/Taskhost.d/Extensions.vb b/ComputingServices/Taskhost.d/Extensions.vb index 5fb7218..c7ff7c5 100644 --- a/ComputingServices/Taskhost.d/Extensions.vb +++ b/ComputingServices/Taskhost.d/Extensions.vb @@ -1,48 +1,49 @@ #Region "Microsoft.VisualBasic::4c6028116bed86fe45bf6a4e74f0af36, ComputingServices\Taskhost.d\Extensions.vb" - ' Author: - ' - ' asuka (amethyst.asuka@gcmodeller.org) - ' xie (genetics@smrucc.org) - ' xieguigang (xie.guigang@live.com) - ' - ' Copyright (c) 2018 GPL3 Licensed - ' - ' - ' GNU GENERAL PUBLIC LICENSE (GPL3) - ' - ' - ' This program is free software: you can redistribute it and/or modify - ' it under the terms of the GNU General Public License as published by - ' the Free Software Foundation, either version 3 of the License, or - ' (at your option) any later version. - ' - ' This program is distributed in the hope that it will be useful, - ' but WITHOUT ANY WARRANTY; without even the implied warranty of - ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ' GNU General Public License for more details. - ' - ' You should have received a copy of the GNU General Public License - ' along with this program. If not, see . - - - - ' /********************************************************************************/ - - ' Summaries: - - ' Module Extensions - ' - ' Properties: EnvironmentLocal, IPAddress, PublicShared - ' - ' Constructor: (+1 Overloads) Sub New - ' Function: [AddressOf], AddressEquals, (+2 Overloads) Invoke - ' - ' - ' /********************************************************************************/ +' Author: +' +' asuka (amethyst.asuka@gcmodeller.org) +' xie (genetics@smrucc.org) +' xieguigang (xie.guigang@live.com) +' +' Copyright (c) 2018 GPL3 Licensed +' +' +' GNU GENERAL PUBLIC LICENSE (GPL3) +' +' +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU General Public License for more details. +' +' You should have received a copy of the GNU General Public License +' along with this program. If not, see . + + + +' /********************************************************************************/ + +' Summaries: + +' Module Extensions +' +' Properties: EnvironmentLocal, IPAddress, PublicShared +' +' Constructor: (+1 Overloads) Sub New +' Function: [AddressOf], AddressEquals, (+2 Overloads) Invoke +' +' +' /********************************************************************************/ #End Region +Imports System.Reflection Imports System.Runtime.CompilerServices Imports Microsoft.VisualBasic.Net.Tcp @@ -85,9 +86,7 @@ Namespace TaskHost #End If End Sub - Public ReadOnly Property PublicShared As System.Reflection.BindingFlags = - System.Reflection.BindingFlags.Public Or - System.Reflection.BindingFlags.Static + Public ReadOnly Property PublicShared As BindingFlags = BindingFlags.Public Or BindingFlags.Static ''' ''' @@ -107,7 +106,7 @@ Namespace TaskHost Public Function Invoke(info As InvokeInfo, host As TaskRemote) As Object If host Is Nothing Then - Return TaskInvoke.TryInvoke(info) + Return RemoteCall.doCall(info) Else Dim rtvl = host.Invoke(info) Dim entry = info.GetMethod diff --git a/ComputingServices/Taskhost.d/Invoke/RemoteCall.vb b/ComputingServices/Taskhost.d/Invoke/RemoteCall.vb new file mode 100644 index 0000000..d330af0 --- /dev/null +++ b/ComputingServices/Taskhost.d/Invoke/RemoteCall.vb @@ -0,0 +1,46 @@ +Imports System.Reflection +Imports System.Runtime.CompilerServices +Imports Microsoft.VisualBasic.Serialization.JSON +Imports sciBASIC.ComputingServices.TaskHost + +Module RemoteCall + + ''' + ''' Invoke the function on the remote server.(远程服务器上面通过这个方法执行函数调用) + ''' + ''' + ''' + ''' + + Public Function Invoke(params As InvokeInfo) As Rtvl + Dim rtvl As Rtvl + + Try + Dim value As Object = doCall(params) + + rtvl = New Rtvl(value) + Catch ex As Exception + ex = New Exception(params.GetJson, ex) + rtvl = New Rtvl(ex) + End Try + + Return rtvl + End Function + + ''' + ''' A common function of invoke the method on the remote machine + ''' + ''' 远程主机上面的函数指针 + ''' + ''' + + Public Function doCall(params As InvokeInfo) As Object + Dim func As MethodInfo = params.GetMethod + Dim paramsValue As Object() = params.parameters _ + .Select(Function(arg) arg.GetValue) _ + .ToArray + Dim value As Object = func.Invoke(Nothing, paramsValue) + + Return value + End Function +End Module diff --git a/ComputingServices/Taskhost.d/Invoke/TaskInvoke.vb b/ComputingServices/Taskhost.d/Invoke/TaskInvoke.vb index 918e4ba..a5f6b88 100644 --- a/ComputingServices/Taskhost.d/Invoke/TaskInvoke.vb +++ b/ComputingServices/Taskhost.d/Invoke/TaskInvoke.vb @@ -82,48 +82,10 @@ Namespace TaskHost Public ReadOnly Property LinqProvider As LinqPool = New LinqPool - ''' - ''' Invoke the function on the remote server.(远程服务器上面通过这个方法执行函数调用) - ''' - ''' - ''' - Public Shared Function Invoke(params As InvokeInfo) As Rtvl - Dim rtvl As Rtvl - - Try - Dim rtvlType As Type = Nothing - Dim value As Object = __invoke(params, rtvlType) - rtvl = New Rtvl(value, rtvlType) - Catch ex As Exception - ex = New Exception(params.GetJson, ex) - rtvl = New Rtvl(ex) - End Try - - Return rtvl - End Function - - ''' - ''' A common function of invoke the method on the remote machine - ''' - ''' 远程主机上面的函数指针 - ''' value's - ''' - Private Shared Function __invoke(params As InvokeInfo, ByRef value As Type) As Object - Dim func As MethodInfo = params.GetMethod - Dim paramsValue As Object() = params.parameters.Select(Function(arg) arg.GetValue).ToArray - Dim x As Object = func.Invoke(Nothing, paramsValue) - value = func.ReturnType - Return x - End Function - - Public Shared Function TryInvoke(info As InvokeInfo) As Object - Return __invoke(info, Nothing) - End Function - Private Function Invoke(CA As Long, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream Dim params As InvokeInfo = JsonContract.LoadJSON(Of InvokeInfo)(args.GetUTF8String) - Dim value As Rtvl = Invoke(params) + Dim value As Rtvl = RemoteCall.Invoke(params) Return New RequestStream(value.GetJson) End Function @@ -144,10 +106,9 @@ Namespace TaskHost Private Function InvokeLinq(CA As Long, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream Dim params As InvokeInfo = JsonContract.LoadJSON(Of InvokeInfo)(args.GetUTF8String) ' 得到远程函数指针信息 - Dim type As Type = Nothing - Dim value As Object = __invoke(params, type) + Dim value As Object = RemoteCall.doCall(params) Dim source As IEnumerable = DirectCast(value, IEnumerable) - Dim svr As String = LinqProvider.OpenQuery(source, type).GetJson ' 返回数据源信息 + Dim svr As String = LinqProvider.OpenQuery(source, value.GetType).GetJson ' 返回数据源信息 Return New RequestStream(svr) End Function