VB.NET中执行动态代码的例子
以下function传入一个逻辑表达式,使用动态代码编译并返回逻辑结果
Shared objCodeCompiler As ICodeCompiler = New VBCodeProvider().CreateCompiler()
Shared objCompilerParameters As New CompilerParameters
Public Shared Function RunLogicalExpression(ByVal strexp As String) As Boolean
objCompilerParameters.GenerateInMemory = True
objCompilerParameters.IncludeDebugInformation = False
Dim strCode As String
strCode = "Namespace TempScript" & ControlChars.CrLf
strCode = strCode & "Public Class DynamicCode" & ControlChars.CrLf
strCode = strCode & "Public Function ExecuteCode(paramarray prmParameters() as object) as Object" & ControlChars.CrLf
strCode = strCode & "End Function" & ControlChars.CrLf
strCode = strCode & "Public Function RunLogicalExpression() as Boolean" & ControlChars.CrLf
strCode = strCode & "Return " & strexp & ControlChars.CrLf
strCode = strCode & "End Function" & ControlChars.CrLf
strCode = strCode & "End Class" & ControlChars.CrLf
strCode = strCode & "End Namespace" & ControlChars.CrLf
Dim objCompileResults As CompilerResults = objCodeCompiler.CompileAssemblyFromSource(objCompilerParameters, strCode)
If objCompileResults.Errors.HasErrors Then
Throw New Exception("Error: Line>" & objCompileResults.Errors(0).Line.ToString & ", " & objCompileResults.Errors(0).ErrorText)
End If
Dim objAssembly As [Assembly] = objCompileResults.CompiledAssembly()
Dim objTheClass As Object = objAssembly.CreateInstance("TempScript.DynamicCode")
If objTheClass Is Nothing Then
Throw New Exception("Can't load class...")
End If
Dim objResult As Object = objTheClass.GetType.InvokeMember("RunLogicalExpression", BindingFlags.InvokeMethod, Nothing, objTheClass, Nothing)
Return objResult
End Function
以下function传入一个逻辑表达式,使用动态代码编译并返回逻辑结果
Shared objCodeCompiler As ICodeCompiler = New VBCodeProvider().CreateCompiler()
Shared objCompilerParameters As New CompilerParameters
Public Shared Function RunLogicalExpression(ByVal strexp As String) As Boolean
objCompilerParameters.GenerateInMemory = True
objCompilerParameters.IncludeDebugInformation = False
Dim strCode As String
strCode = "Namespace TempScript" & ControlChars.CrLf
strCode = strCode & "Public Class DynamicCode" & ControlChars.CrLf
strCode = strCode & "Public Function ExecuteCode(paramarray prmParameters() as object) as Object" & ControlChars.CrLf
strCode = strCode & "End Function" & ControlChars.CrLf
strCode = strCode & "Public Function RunLogicalExpression() as Boolean" & ControlChars.CrLf
strCode = strCode & "Return " & strexp & ControlChars.CrLf
strCode = strCode & "End Function" & ControlChars.CrLf
strCode = strCode & "End Class" & ControlChars.CrLf
strCode = strCode & "End Namespace" & ControlChars.CrLf
Dim objCompileResults As CompilerResults = objCodeCompiler.CompileAssemblyFromSource(objCompilerParameters, strCode)
If objCompileResults.Errors.HasErrors Then
Throw New Exception("Error: Line>" & objCompileResults.Errors(0).Line.ToString & ", " & objCompileResults.Errors(0).ErrorText)
End If
Dim objAssembly As [Assembly] = objCompileResults.CompiledAssembly()
Dim objTheClass As Object = objAssembly.CreateInstance("TempScript.DynamicCode")
If objTheClass Is Nothing Then
Throw New Exception("Can't load class...")
End If
Dim objResult As Object = objTheClass.GetType.InvokeMember("RunLogicalExpression", BindingFlags.InvokeMethod, Nothing, objTheClass, Nothing)
Return objResult
End Function