Zdrojové kódy pro vývojáře.
Přeskočit odkazy pro navigaci Top 10 přispěvatelů
UživatelČlánky
codeshare45
sochor1
stoupa1
tomas.oplt15
Článek: Vytvoření dynamické assembly
Špatný Super
Autor:
Vytvořeno:
Popularita:

Vytvoření dynamické assembly je vhodné v případě kdy očekáváte od uživatele nějaký vstup, který nelze dopředu predikovat.
Typickým příkladem může být vstup: spočítej výsledek příkladu 8:4. Aplikace neví zda uživatel použije operátor +-:*.


 

Imports System
Imports System.CodeDom
Imports System.CodeDom.Compiler
Imports Microsoft.CSharp
Imports System.Text
Imports System.Reflection

Namespace RuntimeEval
    Public Class Evaluator

        'variables
        Const staticMethodName As String = "__foo"
        Private _Compiled As Object = Nothing

        'Constructors
        Public Sub New(ByVal items As EvaluatorItem())
            ConstructEvaluator(items)
        End Sub

        Public Sub New(ByVal returnType As Type, ByVal expression As String, ByVal name As String)
            Dim items(0) As EvaluatorItem
            items(0) = New EvaluatorItem(returnType, expression, name)
            ConstructEvaluator(items)
        End Sub

        Public Sub New(ByVal item As EvaluatorItem)
            Dim items() As EvaluatorItem = {item}
            ConstructEvaluator(items)
        End Sub

        Dim comp As ICodeCompiler
        Dim cp As CompilerParameters

        'Methods
        Private Sub ConstructEvaluator(ByVal items() As EvaluatorItem)
            'If compiler is not created - create instance 
            If IsNothing(comp) Then
                comp = New Microsoft.VisualBasic.VBCodeProvider().CreateCompiler()
                cp = New CompilerParameters()
                'Add necessary assemblies 
                cp.ReferencedAssemblies.Add("system.dll")
                'Assembly Only in memory
                cp.GenerateExecutable = False
                cp.GenerateInMemory = True
            End If
            'Now build Class code 
            Dim code As StringBuilder = New StringBuilder()
            'Imports 
            code.Append("Imports System " & vbCrLf)
            'Namespace
            code.Append("namespace RuntimeEval " & vbCrLf)
            'Class
            code.Append("  Public Class _Evaluator " & vbCrLf)

            Dim item As EvaluatorItem
            Dim itemExpression As String = ""

            For Each item In items
                'Function 
                code.AppendFormat("    Public Function {0} As {1} ", item.Name, item.ReturnType.Name)
                'New line
                code.Append(vbCrLf)
                'Function body
                code.AppendFormat("      return ({0}) ", item.Expression)
                'End function
                code.Append(vbCrLf & "    End Function" & vbCrLf)
                itemExpression = item.Expression
            Next
            'End class
            code.Append("End Class" & vbCrLf)
            'End namespace
            code.Append("End Namespace")
            'Try to COMPILE 
            Dim cr As CompilerResults = comp.CompileAssemblyFromSource(cp, code.ToString())
            'If there are some errors - show errors
            If (cr.Errors.HasErrors) Then
                Dim Xerror As StringBuilder = New StringBuilder()
                Dim err As CompilerError
                For Each err In cr.Errors
                    Xerror.AppendFormat("{0}" & vbCrLf, err.ErrorText)
                Next
                Xerror.Append(itemExpression)
                MessageBox.Show("Error Compiling Expression: " + Xerror.ToString(), "Error", MessageBoxButtons.OK)
            End If
            'Save compiled assembly 
            Dim a As [Assembly] = cr.CompiledAssembly
            'Try to create instance of class from assembly 
            _Compiled = a.CreateInstance("RuntimeEval._Evaluator")
        End Sub


        'Methods 
        Public Function EvaluateInt(ByVal name As String) As Int32
            Return Evaluate(name)
        End Function

        Public Function EvaluateString(ByVal name As String) As String
            Return Evaluate(name)
        End Function

        Public Function EvaluateBool(ByVal name As String) As Boolean
            Return Evaluate(name)
        End Function

        Public Function Evaluate(ByVal name As String) As Object
            Dim mi As MethodInfo = _Compiled.GetType().GetMethod(name)
            Return mi.Invoke(_Compiled, Nothing)
        End Function

        Public Sub EvaluateExpression(ByVal returnType As Type, ByVal expression As String, ByVal name As String)
            Dim items(0) As EvaluatorItem
            items(0) = New EvaluatorItem(returnType, expression, name)
            ConstructEvaluator(items)
        End Sub

    End Class

    Public Class EvaluatorItem
        Public Sub New(ByVal returnType_ As [Type], ByVal expression_ As String, ByVal name_ As String)
            ReturnType = returnType_
            Expression = expression_
            Name = name_
        End Sub

        Public ReturnType As [Type]
        Public Name As String
        Public Expression As String
    End Class

End Namespace

 
  Na stránku 
screen  Nový příspěvek
Název  Uživatel  Datum 
Poslední návštěva: 20:57:53, 22. září 2017 První  Předchozí  0 Záznamů  Další  Poslední  

Autor článku
Jméno
Pracovní pozice
Informace
Foto

   

Počet návštěvníků:87
 
  Kontakt