1 #Region "Microsoft.VisualBasic::8ff64e0303cac9a0b06831b3eadcfc22, Microsoft.VisualBasic.Core\CommandLine\Reflection\CLIToken.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     '     Class RunDllEntryPoint
35     
36     '         Constructor: (+1 OverloadsSub New
37     '         FunctionGetDllMethod, GetPoint
38     
39     '     Class CLIToken
40     
41     '         Properties: Name
42     
43     '         Constructor: (+1 OverloadsSub New
44     '         FunctionToString
45     
46     '     Class CLIParameter
47     
48     '         Constructor: (+1 OverloadsSub New
49     
50     
51     ' /********************************************************************************/
52
53 #End Region
54
55 Imports System.Reflection
56 Imports Microsoft.VisualBasic.ComponentModel.Collection.Generic
57 Imports Microsoft.VisualBasic.ComponentModel.DataSourceModel
58 Imports Microsoft.VisualBasic.Language
59
60 Namespace CommandLine.Reflection
61
62     Public Class RunDllEntryPoint : Inherits [Namespace]
63
64         ''' <summary>
65         ''' rundll namespace::api
66         ''' </summary>
67         ''' <param name="Name"></param>
68         Sub New(Name As String)
69             Call MyBase.New(Name, "")
70         End Sub
71
72         ''' <summary>
73         ''' 
74         ''' </summary>
75         ''' <param name="entrypoint$"></param>
76         ''' <returns>
77         ''' 假若没有api的名称的话,是默认使用一个名字为``Main``的主函数来运行的
78         ''' </returns>
79         Public Shared Function GetPoint(entrypoint$) As NamedValue(Of String)
80             Dim entry = entrypoint.GetTagValue("::", trim:=True)
81             If entry.Value.StringEmpty Then
82                 entry.Value = "Main"
83             End If
84             Return entry
85         End Function
86
87         Public Shared Function GetDllMethod(assembly As Assembly, entryPoint$) As MethodInfo
88             Dim entry As NamedValue(Of String) = GetPoint(entryPoint)
89             Dim types As Type() = GetTypesHelper(assm:=assembly)
90             Dim dll As Type = LinqAPI.DefaultFirst(Of Type) _
91  _
92                 () <= From type As Type
93                       In types
94                       Let load = type.GetCustomAttribute(Of RunDllEntryPoint)
95                       Let name = load?.Namespace
96                       Where Not load Is Nothing AndAlso name.TextEquals(entry.Name)
97                       Select type
98
99             If dll Is Nothing Then
100                 Return Nothing
101             Else
102                 Dim matchName = Function(m As MethodInfo)
103                                     Return m.Name.TextEquals(entry.Value)
104                                 End Function
105                 Dim method As MethodInfo = dll _
106                     .GetMethods(PublicShared) _
107                     .Where(predicate:=matchName) _
108                     .FirstOrDefault
109
110                 Return method
111             End If
112         End Function
113     End Class
114
115     ''' <summary>
116     ''' A very basically type in the <see cref="CommandLine"/>
117     ''' </summary>
118     Public MustInherit Class CLIToken : Inherits Attribute
119         Implements IReadOnlyId
120
121         ''' <summary>
122         ''' Name of this token object, this can be parameter name or api name.
123         ''' </summary>
124         ''' <returns></returns>
125         Public Overridable ReadOnly Property Name As String Implements IReadOnlyId.Identity
126
127         ''' <summary>
128         ''' Init this token by using <see cref="name"/> value.
129         ''' </summary>
130         ''' <param name="name">Token name</param>
131         Sub New(name As String)
132             Me.Name = name
133         End Sub
134
135         Public Overrides Function ToString() As String
136             Return Name
137         End Function
138     End Class
139
140     <AttributeUsage(AttributeTargets.Property, AllowMultiple:=False, Inherited:=True)>
141     Public Class CLIParameter : Inherits CLIToken
142
143         Sub New(name As String)
144             Call MyBase.New(name)
145         End Sub
146     End Class
147 End Namespace