Импортировать код из текста 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.

Другие вопросы по тегам