1 #Region "Microsoft.VisualBasic::6a37b6f937164793150a19d2d292c16e, Microsoft.VisualBasic.Core\Extensions\CodeDOM\VBC.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     '     Module VBC
35     
36     '         Function: (+2 Overloads) CompileCode, (+2 Overloads) CreateParameters
37     
38     
39     ' /********************************************************************************/
40
41 #End Region
42
43 Imports System.CodeDom.Compiler
44 Imports System.Reflection
45 Imports System.Text
46 Imports Microsoft.VisualBasic.Language
47
48 Namespace Emit.CodeDOM_VBC
49
50     ''' <summary>
51     ''' Extension wrappers for VisualBasic compiler
52     ''' </summary>
53     ''' <remarks>
54     ''' https://www.codeproject.com/articles/113169/c-as-a-scripting-language-in-your-net-applications
55     ''' </remarks>
56     Public Module VBC
57
58         ''' <summary>
59         ''' Construct of the ``vbc.exe`` compiler parameters <see cref="CompilerParameters"/>.
60         ''' </summary>
61         ''' <param name="ref"></param>
62         ''' <param name="SDK"></param>
63         ''' <param name="dll"></param>
64         ''' <returns></returns>
65         Public Function CreateParameters(ref As IEnumerable(Of String), Optional SDK$ = net46Default, Optional dll As Boolean = TrueAs CompilerParameters
66             Dim args As CompilerParameters = If(dll, DllProfile, ExecutableProfile)
67             Dim libs As New List(Of String)
68
69             libs += From path As String
70                     In ref
71                     Where Array.IndexOf(DotNETFramework, path.BaseName) = -1
72                     Select path '
73             libs += {
74                 SDK & "\System.dll",
75                 SDK & "\System.Core.dll",
76                 SDK & "\System.Data.dll",
77                 SDK & "\System.Data.DataSetExtensions.dll",
78                 SDK & "\System.Xml.dll",
79                 SDK & "\System.Xml.Linq.dll"
80             }
81             Call args.ReferencedAssemblies.AddRange(libs)
82             Return args
83         End Function
84
85         ''' <summary>
86         ''' <see cref="App.References"/>
87         ''' </summary>
88         ''' <param name="SDK$"></param>
89         ''' <param name="dll"></param>
90         ''' <returns></returns>
91         Public Function CreateParameters(references As String(), Optional SDK$ = net46Default, Optional dll As Boolean = TrueAs CompilerParameters
92             Return CreateParameters(ref:=references, dll:=dll, SDK:=SDK)
93         End Function
94
95         ''' <summary>
96         ''' 
97         ''' </summary>
98         ''' <param name="code">VisualBasic源代码</param>
99         ''' <param name="output">The output ``*.exe`` file.</param>
100         ''' <returns></returns>
101         Public Function CompileCode(code As String, output As StringOptional ByRef errInfo As String = ""As Assembly
102             Dim params As New CompilerParameters() With { ' Make sure we generate an EXE, not a DLL
103                 .GenerateExecutable = True,
104                 .OutputAssembly = output
105             }
106
107             Return VBC.CompileCode(code, params, errInfo)
108         End Function
109
110         ''' <summary>
111         ''' If the code compile failure, then this function will returns nothing.
112         ''' </summary>
113         ''' <param name="code">VisualBasic源代码</param>
114         ''' <returns><see cref="Assembly"/> from the source <paramref name="code"/></returns>
115         Public Function CompileCode(code As String, args As CompilerParameters, Optional ByRef errInfo As String = ""As Assembly
116             Dim codeProvider As New VBCodeProvider()
117 #Disable Warning
118             Dim icc As ICodeCompiler = codeProvider.CreateCompiler
119 #Enable Warning
120             Dim results As CompilerResults = icc.CompileAssemblyFromSource(args, code)
121
122             If results.Errors.Count > 0 Then   ' There were compiler errors
123                 Dim err As New StringBuilder("There were compiler errors:")
124                 Call err.AppendLine()
125                 Call err.AppendLine()
126
127                 For Each CompErr As CompilerError In results.Errors
128                     Dim errDetail As String = "Line number " & CompErr.Line &
129                         ", Error Number: " & CompErr.ErrorNumber &
130                         ", '" & CompErr.ErrorText & ";"
131
132                     Call err.AppendLine(errDetail)
133                     Call err.AppendLine()
134                 Next
135
136                 errInfo = err.ToString
137
138                 Return Nothing
139             Else
140                 ' Successful Compile
141                 Return results.CompiledAssembly
142             End If
143         End Function
144     End Module
145 End Namespace