Привет
Я работаю над проектом, в котором мой класс должен выполнять код VB, предоставленный пользователем, чтобы упростить его. Я пытаюсь воссоздать свою собственную функцию eval. Для выполнения этой задачи я использую следующий код, который я нашел в Интернете
Imports Microsoft.VisualBasic
Imports System
Imports System.Text
Imports System.CodeDom.Compiler
Imports System.Reflection
Imports System.IO
Namespace PAB.Util
Public Class EvalProvider
Public Function VS_Eval(ByVal vbCode As String) As Object
Dim c As VBCodeProvider = New VBCodeProvider
Dim icc As ICodeCompiler = c.CreateCompiler()
Dim cp As CompilerParameters = New CompilerParameters
cp.ReferencedAssemblies.Add("system.dll")
cp.ReferencedAssemblies.Add("system.xml.dll")
cp.ReferencedAssemblies.Add("system.data.dll")
' Sample code for adding your own referenced assemblies
'cp.ReferencedAssemblies.Add("c:\yourProjectDir\bin\YourBaseClass.dll")
'cp.ReferencedAssemblies.Add("YourBaseclass.dll")
cp.CompilerOptions = "/t:library"
cp.GenerateInMemory = True
Dim sb As StringBuilder = New StringBuilder("")
sb.Append("Imports System" & vbCrLf)
sb.Append("Imports System.Xml" & vbCrLf)
sb.Append("Imports System.Data" & vbCrLf)
sb.Append("Imports System.Data.SqlClient" & vbCrLf)
sb.Append("Namespace PAB " & vbCrLf)
sb.Append("Class PABLib " & vbCrLf)
sb.Append("public function EvalCode() as Object " & vbCrLf)
'sb.Append("YourNamespace.YourBaseClass thisObject = New YourNamespace.YourBaseClass()")
sb.Append(vbCode & vbCrLf)
sb.Append("End Function " & vbCrLf)
sb.Append("End Class " & vbCrLf)
sb.Append("End Namespace" & vbCrLf)
Debug.WriteLine(sb.ToString()) ' look at this to debug your eval string
Dim cr As CompilerResults = icc.CompileAssemblyFromSource(cp, sb.ToString())
Dim a As System.Reflection.Assembly = cr.CompiledAssembly
Dim o As Object
Dim mi As MethodInfo
o = a.CreateInstance("PAB.PABLib")
Dim t As Type = o.GetType()
mi = t.GetMethod("EvalCode")
Dim s As Object
s = mi.Invoke(o, Nothing)
Return s
End Function
End Class
End Namespace
Проблема с кодом в том, что он не может получить доступ к каким-либо переменным или их значениям, поэтому я решил получить имена переменных, их типы значений и их типы динамически и воссоздать их в классе, который создается динамически.
Пожалуйста, предложите способ получения имен переменных там типов и значений в текущем классе или методе, чтобы я мог воссоздать их и выполнить код, переданный пользователем, пользователь знает, какие переменные находятся в текущем классе или методе, и есть типы данных, но он не знает значений, так как они могли измениться, поэтому он не может их инициализировать.
Есть ли способ сделать это, этот код будет вызываться на странице asp.net при событии page_load, код, передаваемый пользователем, сохраняется в переменной vbCode, передаваемой в качестве параметра.
Если есть какой-либо другой способ сделать это, пожалуйста, предложите
Спасибо