HOWTO: Visual Basic .NET 컴파일러를 사용하여 프로그래밍 방식으로 코드 컴파일하기

이 문서의 Microsoft C# .NET 버전에 대한 내용은 304655 를 참조하십시오.

요약

.NET Framework에서는 Visual Basic .NET 언어 컴파일러에 프로그래밍 방식으로 액세스할 수 있게 해주는 클래스를 제공합니다. 언어 컴파일러는 또한 사용자 자신의 코드 컴파일링 유틸리티를 작성할 때도 유용합니다. 이 문서는 텍스트 원본에서 코드를 컴파일할 수 있도록 예제 코드를 제공합니다. 응용 프로그램을 사용하여 실행 파일을 작성하거나, 실행 파일을 작성 및 실행할 수 있습니다. 컴파일 과정에서 발생하는 오류는 모두 폼에 표시됩니다.

추가 정보

1단계: 요구 사항

  • Visual Studio .NET
  • Visual Basic .NET 언어 컴파일러

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 호출은 어셈블리가 컴파일되는 위치를 나타냅니다. 이 메서드는 문자열에 해당하는 매개 변수 개체와 원시 코드를 사용합니다. 코드를 컴파일했으면 컴파일 오류가 있는지 확인할 수 있습니다. 이 예에서는 CompilerResults 개체에 해당하는 CompileAssemblyFromSource의 반환 값을 사용합니다. 이 개체에는 오류 컬렉션이 포함되어 있는데 여기에는 컴파일하는 동안 발생한 오류가 모두 포함되어 있습니다.
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 온라인을 참조하십시오.

3단계: 단계별 예제

  1. 새로운 Visual Basic .NET 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
  3. 프로젝트를 실행합니다. Form1이 로드되면 Build 단추를 누릅니다. 두 개의 컴파일러 오류가 발생한 것을 확인할 수 있습니다.
  4. 그 다음, 아래의 코드를 텍스트 상자에 복사하여 기존 텍스트를 바꿉니다.
    Imports System

    Module Module1

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

    End Module
  5. Build를 다시 누릅니다. 성공적으로 컴파일됩니다.
  6. Run을 누르면 코드가 컴파일되고 그 결과로 실행 파일이 실행됩니다. 실행 중인 응용 프로그램과 같은 폴더에 "Out.exe"라는 실행 파일이 만들어집니다.

    참고: 텍스트 상자의 코드를 수정하여 다른 컴파일러 오류를 확인할 수 있습니다. 예를 들어, 괄호 중 하나를 삭제하고 코드를 다시 작성합니다.
  7. 마지막으로 텍스트 상자의 코드를 수정하여 다른 텍스트 줄이 콘솔 창으로 출력되게 합니다. Run을 눌러 출력 결과를 확인합니다.
속성

문서 ID: 304654 - 마지막 검토: 2004. 3. 4. - 수정: 1

피드백