Comment compiler du code par programme à l’aide du compilateur Visual Basic .NET ou Visual Basic 2005

Pour obtenir une version Microsoft Visual C# .NET de cet article, reportez-vous à la section.
304655 .

Cet article fait référence à l’espace de noms bibliothèque de classes Microsoft.NET Framework suivant :
  • System.CodeDom.Compiler

Résumé

Le.NET Framework expose des classes qui vous permettent d’accéder par programme le compilateur de langage de Visual Basic 2005 ou de Visual Basic .NET. Cela peut également être utile si vous souhaitez écrire vos propres utilitaires de compilation de code. Cet article fournit des exemples de code qui vous permet de compiler du code à partir d’une source de texte. L’application vous permet de simplement générer le fichier exécutable ou générez le fichier exécutable et exécutez-le. Toutes les erreurs qui se produisent pendant le processus de compilation sont affichées sur le formulaire.

Plus d'informations

Étape 1 : configuration requise

  • Visual Studio .NET ou Visual Studio 2005
  • Compilateur de langue Visual Basic .NET ou le compilateur de langage de Visual Basic 2005

Étape 2 : Comment compiler du Code par programme

Le.NET Framework fournit l’interface de l’exécution du compilateur ICodeCompiler. VBCodeProvider (classe) implémente cette interface et fournit l’accès aux instances du Générateur de code de Visual Basic et du compilateur de code. L’exemple suivant crée une instance de la VBCodeProvider et l’utilise pour obtenir une référence à une interface ICodeCompiler.

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


Une fois que vous avez une référence à une interface ICodeCompiler, vous pouvez l’utiliser pour compiler votre code source. Pour passer des paramètres au compilateur à l’aide de la classe CompilerParameters . Voici un exemple :
Dim parameters As New CompilerParameters()Dim results As CompilerResults

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


Le code ci-dessus utilise l’objet CompilerParameters pour indiquer au compilateur que vous souhaitez générer un fichier exécutable (par opposition à une DLL) et que vous souhaitez copier l’assembly résultant sur le disque. L’appel à CompileAssemblyFromSource est lorsque votre assembly obtient compilé. Cette méthode prend l’objet de paramètres et le code source, qui est une chaîne. Une fois que vous compilez votre code, vous pouvez vérifier pour voir si les erreurs de compilation. Nous utilisons la valeur de retour à partir de CompileAssemblyFromSource, qui est un objet CompilerResults . Cet objet contient une collection d’erreurs, qui contient toutes les erreurs qui se sont produites pendant la compilation.
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



Il existe des autres options de compilation, telles que la compilation d’un fichier. Vous pouvez également batch compilation, ce qui signifie que vous pouvez compiler plusieurs fichiers ou les sources en même temps. Plus d’informations sur ces classes sont disponibles sur MSDN Online :

Étape 3 : Exemple étape par étape

  1. Créez une nouvelle Application de Windows de Visual Basic 2005 ou Visual Basic .NET. Form1 est créé par défaut.
  2. Dans la fenêtre d’affichage du Code de Form1, remplacez tout le texte existant par le code suivant :
    Option Strict OnImports 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

    Remarque Le code doit être modifié dans Visual Basic 2005. Si vous créez un nouveau formulaire appelé Form1 dans Visual Basic 2005, vous avez un fichier nommé Form1.vb pour votre code et un fichier Form1.Designer.vb qui contient la partie automatiquement générée. Le Concepteur Windows Forms utilise le mot clé partial pour diviser l’implémentation de Form1 en deux fichiers distincts. Cela empêche le code émis par le Concepteur d’être entrecoupé par votre code. Pour plus d’informations sur les améliorations du langage Visual Basic 2005, visitez le site Web de Microsoft à l’adresse suivante :Pour plus d’informations sur les classes partielles et le Concepteur Windows Forms, visitez le site Web de Microsoft à l’adresse suivante :
  3. Exécutez le projet. Après le chargement de Form1, cliquez sur le bouton Générer . Notez qu’un certain nombre d’erreurs du compilateur.
  4. Ensuite, copiez le code suivant dans la zone de texte, remplacer le texte existant :
    Imports System
    Module Module1

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

    End Module

  5. Cliquez à nouveau sur Générer . La compilation doit réussir.
  6. Cliquez sur exécuter et compiler le code et exécutez le fichier exécutable obtenu. La compilation crée un fichier exécutable appelé « Out.exe » dans le même dossier que l’application que vous exécutez.

    Remarque : Vous pouvez modifier le code dans la zone de texte pour voir les erreurs du compilateur différents. Par exemple, supprimez l’une des parenthèses et régénérer le code.
  7. Enfin, modifiez le code dans la zone de texte pour la sortie d’une autre ligne de texte dans la fenêtre de console. Cliquez sur exécuter pour afficher la sortie.
Propriétés

ID d'article : 304654 - Dernière mise à jour : 26 janv. 2017 - Révision : 1

Commentaires