Импортировать код из текста VB.NET
Возможно ли событие импортировать текст в виде кода, а затем добавить его в подпрограмму в vb.net? Если у меня есть файл.txt, заполненный кодом, могу ли я импортировать его программно (кнопкой)?
Мне нужно, чтобы vb.net принял этот скрипт (txt-файл) и использовал его для объявления переменных и создания функций / подпрограмм - это все, что мне нужно.
2 ответа
Вы можете делать такие вещи, используя объекты CodeDom. Объекты CodeDom позволяют динамически генерировать сборки во время выполнения. Например, если вы делаете интерфейс
Public Interface IScript
Property Variable1 As String
Sub DoWork()
End Interface
Затем вы создаете метод, например так:
Imports Microsoft.VisualBasic
Imports System.CodeDom.Compiler
' ...
Public Function GenerateScript(code As String) As IScript
Using provider As New VBCodeProvider()
Dim parameters As New CompilerParameters()
parameters.GenerateInMemory = True
parameters.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location)
Dim interfaceNamespace As String = GetType(IScript).Namespace
Dim codeArray() As String = New String() {"Imports " & interfaceNamespace & Environment.NewLine & code}
Dim results As CompilerResults = provider.CompileAssemblyFromSource(parameters, codeArray)
If results.Errors.HasErrors Then
Throw New Exception("Failed to compile script")
Else
Return CType(results.CompiledAssembly.CreateInstance("Script"), IScript)
End If
End Using
End Function
Теперь вы можете назвать это так:
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim builder As New StringBuilder()
builder.AppendLine("Public Class Script")
builder.AppendLine(" Implements IScript")
builder.AppendLine(" Public Property Variable1 As String Implements IScript.Variable1")
builder.AppendLine(" Public Sub DoWork() Implements IScript.DoWork")
builder.AppendLine(" Variable1 = ""Hello World""")
builder.AppendLine(" End Sub")
builder.AppendLine("End Class")
Dim script As IScript = GenerateScript(builder.ToString())
script.DoWork()
MessageBox.Show(script.Variable1) ' Displays "Hello World"
End Sub
Очевидно, что вместо сборки кода в сборщике строк, вы можете загрузить его из текстового файла, например так:
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim script As IScript = GenerateScript(File.ReadAllText("C:\script.txt")
script.DoWork()
MessageBox.Show(script.Variable1) ' Displays "Hello World"
End Sub
У меня проблемы с этим .. Я получаю эту ошибку.
Function GenerateScript doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.