1 #Region "Microsoft.VisualBasic::bba9605f99a58a17721add7e0e4d3328, Microsoft.VisualBasic.Core\ApplicationServices\Debugger\NETDebugger.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     
35     ' /********************************************************************************/
36
37 #End Region
38
39 'Imports System.Reflection
40
41 Namespace ApplicationServices.Debugging
42
43     ' ''' <summary>
44     ' ''' .NET程序调试器
45     ' ''' </summary>
46     ' ''' <remarks></remarks>
47     'Public Class NETDebugger
48
49     '    ''' <summary>
50     '    ''' 
51     '    ''' </summary>
52     '    ''' <param name="AssemblyPath">.NET应用程序可执行文件或者包含有Main定义的dll文件</param>
53     '    ''' <param name="argvs">调试所使用的命令行参数</param>
54     '    ''' <returns></returns>
55     '    ''' <remarks></remarks>
56     '    Public Function Start(AssemblyPath As String, argvs As String()) As Integer
57
58     '        AssemblyPath = FileIO.FileSystem.GetFileInfo(AssemblyPath).FullName
59
60     '        Dim Assembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(AssemblyPath)
61     '        Dim GetMainEntryLQuery = (From TypeEntry As System.Reflection.TypeInfo
62     '                                  In Assembly.DefinedTypes
63     '                                  Let EntryMain As MethodInfo = GetMainEntry(TypeEntry)
64     '                                  Where EntryMain IsNot Nothing
65     '                                  Select EntryMain).ToArray
66
67     '        If GetMainEntryLQuery.IsNullOrEmpty Then
68     '            Return -100
69     '        End If
70
71     '        Dim Main = GetMainEntryLQuery.First
72     '        Return RunMain(Main, argvs)
73     '    End Function
74
75     '    ''' <summary>
76     '    ''' 函数会递归查询
77     '    ''' </summary>
78     '    ''' <param name="TypeInfo"></param>
79     '    ''' <returns></returns>
80     '    ''' <remarks></remarks>
81     '    Public Shared Function GetMainEntry(TypeInfo As Type) As MethodInfo
82     '        Dim LQuery = (From Method As System.Reflection.MethodInfo
83     '                      In TypeInfo.GetMethods(BindingFlags.Public Or BindingFlags.Static)
84     '                      Where String.Equals(Method.Name, "Main"StringComparison.OrdinalIgnoreCase) AndAlso IsStandardMainReturnType(Method.ReturnType) AndAlso IsStandardMainParameterType(Method)
85     '                      Select Method).ToArray
86     '        Return LQuery.FirstOrDefault
87     '    End Function
88
89     '    Private Shared Function IsStandardMainReturnType(Type As Type) As Boolean
90     '        Return System.Type.Equals(Type, GetType(Void)) OrElse System.Type.Equals(Type, GetType(Integer))
91     '    End Function
92
93     '    Private Shared Function IsStandardMainParameterType(MethodInfo As MethodInfo) As Boolean
94     '        Dim pList = MethodInfo.GetParameters
95
96     '        If pList.Count > 1 Then
97     '            Return False
98     '        ElseIf pList.IsNullOrEmpty Then
99     '            Return True
100     '        End If
101
102     '        Dim pTypeInfo As System.Type = pList(0).ParameterType
103     '        Return pTypeInfo.Equals(GetType(String)) OrElse pTypeInfo.Equals(GetType(String()))
104     '    End Function
105
106     '    ''' <summary>
107     '    ''' 启动Main函数
108     '    ''' </summary>
109     '    ''' <param name="Main"></param>
110     '    ''' <param name="argvs"></param>
111     '    ''' <returns></returns>
112     '    ''' <remarks></remarks>
113     '    Private Function RunMain(Main As MethodInfo, argvs As String()) As Integer
114
115     '        Dim pValue As Object()
116     '        Dim pInfo = Main.GetParameters
117
118     '        If pInfo.IsNullOrEmpty Then
119     '            pValue = New Object() {} '函数没有参数
120     '        Else
121     '            If pInfo(0).Equals(GetType(String)) Then
122     '                pValue = {argvs(0)}  '字符串
123     '            Else
124     '                pValue = {argvs} '字符串数组
125     '            End If
126     '        End If
127
128     '        Dim result = InternalRunFunction(Main, pValue)
129
130     '        If Main.ReturnType.Equals(GetType(Integer)) Then
131     '            Return DirectCast(result, Integer)
132     '        Else
133     '            Return 0
134     '        End If
135     '    End Function
136
137     '    ''' <summary>
138     '    ''' 在终端之上打印出每一行代码
139     '    ''' </summary>
140     '    ''' <param name="EntryPoint"></param>
141     '    ''' <param name="argvs"></param>
142     '    ''' <returns></returns>
143     '    ''' <remarks></remarks>
144     '    Private Function InternalRunFunction(EntryPoint As MethodInfo, argvs As Object()) As Object
145
146
147
148     '    End Function
149
150     'End Class
151 End Namespace