Imports System.Text
Imports System.CodeDom.Compiler
Imports System.Collections.Specialized
Public Class Evaluador
Private oEnsamblado As System.Reflection.Assembly
Public Function PrecompilarAssembly(ByVal Funcion As String, _
ByVal ParametrosList As StringCollection, ByVal NameSpaceList As StringCollection) As Boolean
Dim mStrings As String
Dim mParametros As String
'Definimos un objeto de tipo StringBuilder que contendra el código a compilar
Dim CodigoFuente As New StringBuilder()
'Agregamos los Imports necesarios a nuestro codigo fuente
For Each mStrings In NameSpaceList
CodigoFuente.Append("Imports " & mStrings & vbCr)
Next
'Preparamos un string con los parametros que usará el metodo Eval
'de de la clase EvalClase
For Each mStrings In ParametrosList
mParametros &= ", " & mStrings
Next
mParametros = Trim(mParametros)
If mParametros.Length > 0 Then
mParametros = Trim(Mid(mParametros, 2))
End If
'Terminamos de construir la clase a compilar
CodigoFuente.Append("Public Class EvalClase" & vbCr)
CodigoFuente.Append(" Public Shared Function Eval(" & _
mParametros & ") as Object" & vbCr)
CodigoFuente.Append(" Return " & Funcion & vbCr)
CodigoFuente.Append(" End Function " & vbCr)
CodigoFuente.Append("End Class " & vbCr)
'Creamos una instancia de la clase VBCodeProvider
'que usaremos para obtener una referencia a una interfaz ICodeCompiler
Dim oCProvider As New VBCodeProvider()
Dim oCompiler As ICodeCompiler = oCProvider.CreateCompiler
'Usamos la clase CompilerParameters para pasar parámetros al compilador
'En particular, definimos que el assembly sea compilado en memoria.
Dim oCParam As New CompilerParameters()
oCParam.GenerateInMemory = True
'Creamos un objeto CompilerResult que obtendrá los resultados de la compilación
Dim oCResult As CompilerResults
oCResult = oCompiler.CompileAssemblyFromSource(oCParam, CodigoFuente.ToString)
'Comprobamos que no existan errores de compilación.
Dim oCError As CompilerError
If oCResult.Errors.Count > 0 Then
'Si existen errores los mostramos.
'Si bien, podriamos implementar un mejor método para visualizar
'los errores de compilación, este nos servirá por los momentos.
For Each oCError In oCResult.Errors
MsgBox(oCError.ErrorText.ToString)
Next
Return False
Else
'Como el ensamblado se generó en memoria, debemos obtener
'una referencia al ensamblado generado, para esto usamos
'la propiedad CompiledAssembly
oEnsamblado = oCResult.CompiledAssembly
Return True
End If
End Function
Public Function Evaluar(ByVal ParamArray Parametros() As Object) As Object
If oEnsamblado Is Nothing Then
Return Nothing
Else
'Instanciamos la clase EvalClase de nuestro assembly
'creando un tipo a partir de ella.
Dim oClass As Type = oEnsamblado.GetType("EvalClase")
'Usamos GetMethod para accesar al método Eval, e invocamos este con los parametros necesarios.
Return oClass.GetMethod("Eval").Invoke(Nothing, Parametros)
End If
End Function
End Class
Jaime Montoya
Santa Ana, 23 de julio de 2008
El Salvador
Página anterior | Volver al principio del trabajo | Página siguiente |