【问题标题】:Import code from text VB.NET从文本 VB.NET 导入代码
【发布时间】:2021-05-24 19:03:03
【问题描述】:

是否可以将文本作为代码导入,然后将其添加到 vb.net 的子目录中? 如果我有一个包含代码的 .txt 文件,我可以通过编程方式(通过按钮)导入它吗?

我需要的是让 vb.net 接受该脚本(txt 文件),并使用它来声明变量并创建函数/子 - 这就是我所需要的。

【问题讨论】:

  • 你也许可以使用 Eval() 来做到这一点,但我不这么认为。
  • 可以使用 CodeDom 动态编译程序集。对于那些对 .NET 有一定了解的人来说,这有点容易做到,但应该始终谨慎行事。通常有更好的方法来做你需要做的事情。为什么你认为你需要这样做?
  • 有关我使用 CodeDom 的含义的示例,请查看我对这个问题的回答:stackoverflow.com/a/10948013/1359668。它在 C# 中,但它应该让你明白我在说什么。
  • 我对你想要做什么感到有点困惑。你能进一步解释一下吗?
  • 正如@StevenDoggart 指出的那样,如果您描述了这种行为的必要性会更好。这种方法有很多问题,很可能有更好的方法来做你想做的事。但是,如果没有您提供更多详细信息,我们将无法为您提供进一步的帮助。

标签: vb.net text


【解决方案1】:

您可以使用 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

【讨论】:

  • 当我使用 script.DoWork() 时到底发生了什么? P.S:对不起,我有点紧张,所以......希望你不在乎,并回答我的问题:)
  • 没有难过的感觉,我知道怎么回事 :) 无论如何,当您调用script.DoWork 时,它会调用字符串生成器中定义的Script.DoWork 方法。在我的示例中,它所做的只是将Variable1 属性的值设置为"Hello World"。但它可以做任何你想做的事——这就是它作为脚本的美妙之处:)
  • 所以它执行代码对吗?但是我如何声明一个变量(或一个全局变量)?这是可选的,但这是我的常识
  • 是的,调用DoWork方法会执行DoWork方法中的代码,就好像它是在你自己的预编译程序集中本地定义的一样。我只是以IScript 接口为例。您可以根据需要在该接口中定义任意数量的方法和属性。 Variable1 属性是我尝试演示如何使用脚本声明一个变量,正如您所提到的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多