Al momento sei offline in attesa che la connessione Internet venga ristabilita

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

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I304654
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 CompilerResultsparameters.GenerateExecutable = Trueparameters.OutputAssembly = Outputresults = 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   NextEnd 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 OnImports System.CodeDom.CompilerPublic 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 SubEnd 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 SystemModule Module1    Sub Main()        Console.WriteLine("Hello World!")        Console.WriteLine("Press ENTER")        Console.ReadLine()    End SubEnd 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.
ICodeCompiler CSharpCodeProvider CompilerParameters
Proprietà

ID articolo: 304654 - Ultima revisione: 01/20/2006 06:54:00 - Revisione: 4.0

Microsoft .NET Framework Software Development Kit 1.0, Microsoft Visual Basic .NET 2002 Standard Edition

  • kbhowto kbbcl kbcompiler kbprod2web KB304654
Feedback