如何以程式設計方式使用 Visual Basic.NET 或 Visual Basic 2005 編譯器來編譯程式碼

文章翻譯 文章翻譯
文章編號: 304654 - 檢視此文章適用的產品。
本文章的有 Microsoft Visual C#.NET] 版本請參閱 304655

本文參照下列 Microsoft.NET Framework 類別庫命名空間:
  • System.CodeDom.Compiler
全部展開 | 全部摺疊

在此頁中

結論

.NET Framework 會公開類別,可讓您以程式設計方式存取 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: Step-by-Step 範例

  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 Form 設計工具會使用部分關鍵字,Form1 實作分成兩個獨立的檔案。這可以防止設計工具發出的程式碼正在與您的程式碼位置顛倒。如需有關 Visual Basic 2005 語言加強功能的詳細資訊,請造訪下列 Microsoft 網站]:
    http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
    如需有關部分類別和 Windows Form 設計工具的詳細資訊,請造訪下列 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 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
關鍵字:?
kbmt kbvs2005applies kbvs2005swept kbbcl kbcompiler kbhowto kbprod2web KB304654 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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