如何以编程方式通过使用编译器,Visual Basic.net 或 Visual Basic 2005 中编译代码

文章翻译 文章翻译
文章编号: 304654 - 查看本文应用于的产品
为这篇文章的一个 Microsoft Visual C#.net 版本,请参阅 304655

下面的 Microsoft.net 框架类库命名空间引用这篇文章:
  • System.CodeDom.Compiler
展开全部 | 关闭全部

本文内容

概要

.NET 框架公开允许您以编程方式访问 Visual Basic.net 或 Visual Basic 2005 语言编译器的类。这也可能很有用,如果您要编写自己的代码编译的实用程序。本文提供了示例代码,使您可以从文本源的代码编译。应用程序允许您只是生成可执行文件或生成可执行文件并运行它。在编译过程中发生的任何错误都显示在窗体上。

更多信息

步骤 1: 要求

  • visual Studio.net 或 Visual Studio 2005
  • Visual Basic.net 语言编译器或 Visual Basic 2005 语言编译器

第 2 步: 如何以编程方式编译代码

.NET Framework 提供了 ICodeCompiler 编译器执行接口。VBCodeProvider 类实现此接口,并提供到 Visual Basic 代码生成器和代码编译器的实例的访问。下面的示例创建了 VBCodeProvider 的实例,并使用它来获取对 ICodeCompiler 接口的引用。

Dim codeProvider As New VBCodeProvider()
Dim icc As ICodeCompiler = codeProvider.CreateCompiler
				

在您有了对 ICodeCompiler 接口的引用后可以使用它来编译源代码。通过使用 CompilerParameters 类,您将参数传递给编译器。下面是一个示例:
Dim parameters As New CompilerParameters()
Dim results As CompilerResults

parameters.GenerateExecutable = True
parameters.OutputAssembly = Output
results = icc.CompileAssemblyFromSource(parameters, SourceText)
				

上面的代码使用 CompilerParameters 对象告诉的编译器您要生成的可执行文件 (相对于 DLL) 和要输出到磁盘生成的程序集。在调用 CompileAssemblyFromSource 是获取编译您的程序集的位置。此方法将参数对象,并在源代码是字符串。一旦您编译代码可以检查是否有任何编译错误,请参阅。我们使用从 CompileAssemblyFromSource,即 CompilerResults 对象返回的值。此对象包含包含在编译过程中出现的所有错误的一个错误集合集合。
If results.Errors.Count > 0 Then
   'There were compiler errors
   Dim CompErr As CompilerError
   For Each CompErr In results.Errors
      textBox2.Text = textBox2.Text & _
                      "Line number " & CompErr.Line & _
                      ", Error Number: " & CompErr.ErrorNumber & _
                      ", '" & CompErr.ErrorText & ";" & _
      Environment.NewLine & Environment.NewLine
   Next
End If

				

有用于编译,如编译文件中的其他选项。您也可以批处理编译,这意味着您可以编译多个文件或多个源一次。这些类的其他信息是 MSDN Online 上的可用:
http://msdn.microsoft.com/en-us/default.aspx

步骤 3: 分步示例

  1. 创建新的 Visual Basic.net 或 Visual Basic 2005 Windows 应用程序。默认情况下创建 Form1。
  2. Form1 代码视图窗口中替换所有现有的文本与下面的代码:
    Option Strict On
    Imports System.CodeDom.Compiler
    
    
    Public Class Form1
        Inherits System.Windows.Forms.Form
    
    #Region " Windows Form Designer generated code "
    
        Public Sub New()
            MyBase.New()
    
            'This call is required by the Windows Form Designer.
            InitializeComponent()
    
            'Add any initialization after the InitializeComponent() call
    
        End Sub
    
        'Form overrides dispose to clean up the component list.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
        Friend WithEvents textBox1 As System.Windows.Forms.TextBox
        Friend WithEvents button1 As System.Windows.Forms.Button
        Friend WithEvents textBox2 As System.Windows.Forms.TextBox
        Friend WithEvents button2 As System.Windows.Forms.Button
    
        'Required by the Windows Form Designer
        Private components As System.ComponentModel.Container
    
        'NOTE: The following procedure is required by the Windows Form Designer
        'It can be modified using the Windows Form Designer.  
        'Do not modify it using the code editor.
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
            Me.textBox2 = New System.Windows.Forms.TextBox()
            Me.textBox1 = New System.Windows.Forms.TextBox()
            Me.button1 = New System.Windows.Forms.Button()
            Me.button2 = New System.Windows.Forms.Button()
            Me.SuspendLayout()
            '
            'textBox2
            '
            Me.textBox2.BackColor = System.Drawing.SystemColors.Control
            Me.textBox2.BorderStyle = System.Windows.Forms.BorderStyle.None
            Me.textBox2.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
            Me.textBox2.ForeColor = System.Drawing.SystemColors.WindowText
            Me.textBox2.Location = New System.Drawing.Point(264, 56)
            Me.textBox2.Multiline = True
            Me.textBox2.Name = "textBox2"
            Me.textBox2.Size = New System.Drawing.Size(240, 232)
            Me.textBox2.TabIndex = 2
            Me.textBox2.Text = ""
            '
            'textBox1
            '
            Me.textBox1.Location = New System.Drawing.Point(16, 48)
            Me.textBox1.Multiline = True
            Me.textBox1.Name = "textBox1"
            Me.textBox1.Size = New System.Drawing.Size(240, 240)
            Me.textBox1.TabIndex = 0
            Me.textBox1.Text = "textBox1"
            '
            'button1
            '
            Me.button1.Location = New System.Drawing.Point(368, 304)
            Me.button1.Name = "button1"
            Me.button1.TabIndex = 1
            Me.button1.Text = "Build"
            '
            'button2
            '
            Me.button2.Location = New System.Drawing.Point(456, 304)
            Me.button2.Name = "button2"
            Me.button2.TabIndex = 1
            Me.button2.Text = "Run"
            '
            'Form1
            '
            Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
            Me.ClientSize = New System.Drawing.Size(544, 333)
            Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.button2, Me.textBox1, Me.button1, Me.textBox2})
            Me.Name = "Form1"
            Me.Text = "Form1"
            Me.ResumeLayout(False)
    
        End Sub
    
    #End Region
    
        Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click, button2.Click
            Dim codeProvider As New VBCodeProvider()
            Dim icc As ICodeCompiler = codeProvider.CreateCompiler
            Dim Output As String = "Out.exe"
            Dim ButtonObject As Button = CType(sender, Button)
    
            textBox2.Text = ""
            Dim parameters As New CompilerParameters()
            Dim results As CompilerResults
            'Make sure we generate an EXE, not a DLL
            parameters.GenerateExecutable = True
            parameters.OutputAssembly = Output
            results = icc.CompileAssemblyFromSource(parameters, textBox1.Text)
    
            If results.Errors.Count > 0 Then
                'There were compiler errors
                textBox2.ForeColor = Color.Red
                Dim CompErr As CompilerError
                For Each CompErr In results.Errors
                    textBox2.Text = textBox2.Text & _
                    "Line number " & CompErr.Line & _
                    ", Error Number: " & CompErr.ErrorNumber & _
                    ", '" & CompErr.ErrorText & ";" & _
                    Environment.NewLine & Environment.NewLine
                Next
            Else
                'Successful Compile
                textBox2.ForeColor = Color.Blue
                textBox2.Text = "Success!"
                'If we clicked run then launch the EXE
                If ButtonObject.Text = "Run" Then Process.Start(Output)
            End If
    
        End Sub
    
    End Class
    					
    注释 的代码应更改在 Visual Basic 2005 中。如果创建了一个名为 Form1 在 Visual Basic 2005 中的新窗体必须 Form1.vb 文件为您的代码和一个 Form1.Designer.vb 文件,其中包含自动生成的一部分。Windows 窗体设计器使用 partial 关键字将 Form1 的实现划分为两个单独的文件。这样可以防止在设计器发出的代码正在与您的代码交错。有关 Visual Basic 2005 语言增强功能的详细信息,请访问下面的 Microsoft 网站:
    http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
    有关分部类和 Windows 窗体设计器的详细信息请访问下面的 Microsoft 网站:
    http://msdn2.microsoft.com/en-us/library/ms171843.aspx
  3. 运行该项目。Form1 加载后,单击 生成器 按钮。请注意您有几个编译器错误。
  4. 接下来,将下面的代码复制到文本框替换任何现有的文本:
    Imports System
    
    Module Module1
    
        Sub Main()
            Console.WriteLine("Hello World!")
            Console.WriteLine("Press ENTER")
            Console.ReadLine()
        End Sub
    
    End Module
    					
  5. 再次单击 生成器。编译应成功。
  6. 单击 运行,它将编译代码并运行所生成的可执行文件。编译将创建一个称为"Out.exe"与您所运行的应用程序相同的文件夹中的可执行文件。

    注:您可以修改代码,以查看不同的编译器错误文本框中。例如对于删除在括号之一,并重新生成代码。
  7. 最后,修改代码,在文本框中输出到控制台窗口的文本的另一条直线。单击 $ 运行 以查看输出。

参考

VBCodeProvider 类
http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.vbcodeprovider.aspx

ICodeCompiler 接口
http://msdn.microsoft.com/en-us/library/system.codedom.compiler.icodecompiler(VS.71).aspx

属性

文章编号: 304654 - 最后修改: 2007年5月11日 - 修订: 4.7
这篇文章中的信息适用于:
  • Microsoft .NET Framework 1.0
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 标准版
  • Microsoft Visual .NET 2002 标准版
关键字:?
kbmt kbvs2005applies kbvs2005swept kbbcl kbcompiler kbhowto kbprod2web KB304654 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 304654
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com