How to Compilare un codice a livello di programmazione utilizzando il compilatore di Visual Basic .NET

Per la versione di questo articolo relativa a Microsoft C# .NET vedere (gli articoli con prefisso "Q" contengono informazioni in inglese):
304655 .

Sommario

Con .NET Framework vengono esposte le classi che consentono di accedere a livello di programmazione a Visual Basic .NET Language Compiler. Questa funzionalità può essere utile anche se si desidera scrivere direttamente le proprie utilità di compilazione del codice. In questo articolo viene fornito un codice di esempio che consente di compilare un codice da un'origine di testo. L'applicazione consente di generare semplicemente l'eseguibile oppure di generarlo ed eseguirlo. Gli eventuali errori che dovessero verificarsi durante il processo di compilazione saranno visualizzati nel form.

Informazioni

Passaggio 1: Requisiti

  • Visual Studio .NET
  • Visual Basic .NET Language Compiler

Passaggio 2: Come compilare un codice a livello di programmazione

In .NET Framework è disponibile l'interfaccia di esecuzione del compilatore ICodeCompiler. La classe VBCodeProvider implementa questa interfaccia e fornisce l'accesso alle istanze del generatore di codice e del compilatore di codice di Visual Basic. Con l'esempio seguente viene creata un'istanza di VBCodeProvider che sarà utilizzata per ottenere un riferimento all'interfaccia ICodeCompiler.


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

Una volta creato il riferimento all'interfaccia IcodeCompiler, sarà possibile utilizzarla per compilare il codice sorgente. Per passare i parametri al compilatore, utilizzare la classe CompilerParameters. Di seguito è riportato un esempio:
Dim parameters As New CompilerParameters()
Dim results As CompilerResults

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

Nel codice precedente viene utilizzato l'oggetto CompilerParameters per comunicare al compilatore che si desidera generare un file eseguibile, non una DLL, e che l'assembly risultante dovrà essere copiato sul disco. Con la chiamata a CompileAssemblyFromSource viene compilato l'assembly. Questo metodo accetta l'oggetto Parameters e il codice sorgente, che è una stringa. Una volta compilato il codice è possibile controllare se si sono verificati errori di compilazione. Viene utilizzato il valore restituito da CompileAssemblyFromSource, che è un oggetto CompilerResults. Questo oggetto contiene un insieme di errori, nel quale sono riportati gli eventuali errori che si sono verificati durante la compilazione.
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

Sono disponibili altre opzioni di compilazione, ad esempio la compilazione da un file. È anche possibile eseguire la compilazione batch, vale a dire che è possibile compilare più file o origini contemporaneamente. Ulteriori informazioni su queste classi sono disponibili su MSDN Online (informazioni in linea inglese):

Passaggio 3: Esempio passo passo

  1. Creare una nuova Applicazione Windows in Visual Basic .NET. In base all'impostazione predefinita viene creato il progetto Form1.
  2. Nella finestra di visualizzazione del codice di Form1 sostituire tutto il testo esistente con il seguente codice:
    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
  3. Eseguire il progetto. Dopo avere caricato Form1, fare clic sul pulsante Genera. Verranno restituiti un paio di errori di compilazione.
  4. Copiare quindi il seguente codice nella casella di testo, sostituendo l'eventuale testo esistente:
    Imports System

    Module Module1

    Sub Main()
    Console.WriteLine("Hello World!")
    Console.WriteLine("Press ENTER")
    Console.ReadLine()
    End Sub

    End Module
  5. Scegliere di nuovo Genera. La compilazione dovrebbe essere completata correttamente.
  6. Scegliere Esegui per compilare il codice ed eseguire il file eseguibile risultante. Durante la compilazione viene creato un file eseguibile denominato "Out.exe" nella stessa cartella dell'applicazione in esecuzione.


    NOTA: è possibile modificare il codice nella casella di testo per visualizzare errori di compilazione differenti. Eliminare, ad esempio, una parentesi quindi rigenerare il codice.
  7. Modificare infine il codice nella casella di testo per visualizzare un'altra riga di testo nella finestra della console. Scegliere Esegui per visualizzare l'output.
Proprietà

ID articolo: 304654 - Ultima revisione: 20 gen 2006 - Revisione: 1

Feedback