A compilar programaticamente código utilizando o compilador de Visual Basic .NET ou Visual Basic 2005

Traduções de Artigos Traduções de Artigos
Artigo: 304654 - Ver produtos para os quais este artigo se aplica.
Para obter uma Microsoft Visual C# .NET versão deste artigo, consulte 304655.

Este artigo faz referência à seguinte espaço de nomes Microsoft .NET Framework Class Library:
  • System.CodeDom.Compiler
Expandir tudo | Reduzir tudo

Nesta página

Sumário

O .NET Framework expõe classes que permitem aceder programaticamente o Visual Basic .NET ou Visual Basic 2005 compilador de idioma. Pode também ser útil se pretender escrever os seus próprios utilitários de compilação de código. Este artigo fornece código de exemplo permite-lhe compilar código a partir de uma origem de texto. A aplicação permite-lhe o basta criar o ficheiro executável ou criar o ficheiro executável e executá-la. Quaisquer erros que ocorram durante o processo de compilação são apresentados no formulário.

Mais Informação

Passo 1: requisitos

  • Visual Studio .NET ou Visual Studio 2005
  • Compilador do Visual Basic .NET idioma ou o compilador de idioma do Visual Basic 2005

Passo 2: Como através de programação compilar código

O .NET Framework fornece a interface de execução do compilador ICodeCompiler. Classe VBCodeProvider implementa esta interface e fornece acesso a instâncias do gerador de código do Visual Basic e do compilador de código. O exemplo seguinte cria uma instância do VBCodeProvider e utiliza-o para obter uma referência a uma interface ICodeCompiler.

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

Quando tiver uma referência a uma interface ICodeCompiler, é possível utilizar para compilar o código de origem. Passar parâmetros para o compilador utilizando a classe CompilerParameters . Eis um exemplo:
Dim parameters As New CompilerParameters()
Dim results As CompilerResults

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

O código acima utiliza o objecto CompilerParameters para indicar o compilador de que pretende gerar um ficheiro executável (por oposição a uma DLL) e que pretende exportar a assemblagem resultante para o disco. A chamada para CompileAssemblyFromSource é onde a assemblagem é compilada. Este método utiliza o objecto de parâmetros e o código de origem, que é uma cadeia. Depois de compilar o código, pode verificar se ocorreram quaisquer erros de compilação. Utilizamos o valor devolvido de CompileAssemblyFromSource , que é um objecto CompilerResults . Este objecto contém uma colecção de erros, que contém quaisquer erros que ocorreram durante a compilação.
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

				

Existem outras opções para compilar, tais como compilar a partir de um ficheiro. Também pode batch compilação, o que significa que pode compilar vários ficheiros ou origens ao mesmo tempo. Estão disponíveis no Web site MSDN online informações adicionais sobre estas classes:
http://msdn.microsoft.com/en-us/default.aspx

Passo 3: Exemplo passo a passo

  1. Crie um novo Visual Basic .NET ou Visual Basic 2005 Windows Application. É criado o Form1 por predefinição.
  2. Na janela de vista de código do Form1, substitua todo o texto existente com o seguinte código:
    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
    					
    NOTA: deve ser alterado o código do Visual Basic 2005. Se criar um novo formulário é denominado Form1 do Visual Basic 2005, terá um ficheiro Form1.VB para o código e um ficheiro Form1.Designer.vb que contém a parte gerada automaticamente. O Windows Forms Designer utiliza a palavra-chave parcial para dividir a implementação do Form1 em dois ficheiros separados. Isto impede que código designer emite a ser intercalados com o código. Para obter mais informações sobre os melhoramentos de idioma do Visual Basic 2005, visite o seguinte Web site da Microsoft:
    http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
    Para obter mais informações sobre classes parciais e o Windows Forms Designer, visite o seguinte Web site da Microsoft:
    http://msdn2.microsoft.com/en-us/library/ms171843.aspx
  3. Execute o projecto. Depois do Form1 é carregado, clique no botão Compilar . Repare que receberá um par de erros do compilador.
  4. Em seguida, copie o código seguinte para a caixa de texto, substituir qualquer texto existente:
    Imports System
    
    Module Module1
    
        Sub Main()
            Console.WriteLine("Hello World!")
            Console.WriteLine("Press ENTER")
            Console.ReadLine()
        End Sub
    
    End Module
    					
  5. Clique em Compilar novamente. A compilação deve ser efectuada com êxito.
  6. Clique em Executar e irá compilar o código e execute o ficheiro executável resultante. A compilação cria um ficheiro executável denominado "Out.exe" na mesma pasta que a aplicação que está a ser executado.

    NOTA: Pode modificar código na caixa de texto para ver os erros do compilador diferente. Por exemplo, elimine dos parênteses e reconstruir o código.
  7. Finalmente, modifique o código na caixa de texto para outra linha de texto para a janela da consola de saída. Clique em Executar para ver os resultados.

Referências

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

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

Propriedades

Artigo: 304654 - Última revisão: 11 de maio de 2007 - Revisão: 4.7
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 1.0
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbvs2005applies kbvs2005swept kbbcl kbcompiler kbhowto kbprod2web KB304654 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 304654

Submeter comentários

 

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