C# 컴파일러를 사용하여 프로그래밍 방식으로 코드 컴파일

이 문서에서는 C# 컴파일러를 사용하여 텍스트 원본에서 코드를 컴파일하는 방법을 설명합니다.

원래 제품 버전: Visual Studio, .NET Framework
원래 KB 번호: 304655

요약

Microsoft .NET Framework C# 언어 컴파일러에 프로그래밍 방식으로 액세스할 수 있는 클래스를 노출합니다. 이는 고유한 코드 컴파일 유틸리티를 작성하려는 경우에 유용할 수 있습니다. 이 문서에서는 텍스트 원본에서 코드를 컴파일할 수 있는 샘플 코드를 제공합니다. 애플리케이션을 사용하면 실행 파일을 빌드하거나 실행 파일을 빌드하고 실행할 수 있습니다. 컴파일 프로세스 중에 발생하는 오류는 양식에 표시됩니다.

요구 사항

  • Visual Studio
  • Visual C# 언어 컴파일러

C# 컴파일러를 사용하여 코드 컴파일

.NET Framework 컴파일러 실행 인터페이스를 ICodeCompiler 제공합니다. 클래스는 CSharpCodeProvider 이 인터페이스를 구현하고 C# 코드 생성기 및 코드 컴파일러의 인스턴스에 대한 액세스를 제공합니다. 다음 샘플 코드는 의 CSharpCodeProvider instance 만들고 이를 사용하여 인터페이스에 대한 참조를 ICodeCompiler 가져옵니다.

CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();

인터페이스에 대한 참조가 ICodeCompiler 있으면 이를 사용하여 소스 코드를 컴파일할 수 있습니다. 클래스를 사용하여 컴파일러에 매개 변수를 전달합니다 CompilerParameters . 예를 들면 다음과 같습니다.

System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.OutputAssembly = Output;
CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString);

위의 코드는 개체를 CompilerParameters 사용하여 DLL이 아닌 실행 파일을 생성하고 결과 어셈블리를 디스크에 출력할 것을 컴파일러에 알릴 수 있습니다. 에 대한 CompileAssemblyFromSource 호출은 어셈블리가 컴파일되는 위치입니다. 이 메서드는 매개 변수 개체와 문자열인 소스 코드를 사용합니다. 코드를 컴파일한 후 검사 컴파일 오류가 있는지 확인할 수 있습니다. 개체인 의 CompileAssemblyFromSourceCompilerResults 반환 값을 사용합니다. 이 개체에는 컴파일 중에 발생한 오류가 포함된 오류 컬렉션이 포함되어 있습니다.

if (results.Errors.Count > 0)
{
    foreach(CompilerError CompErr in results.Errors)
    {
        textBox2.Text = textBox2.Text +
            "Line number " + CompErr.Line +
            ", Error Number: " + CompErr.ErrorNumber +
            ", '" + CompErr.ErrorText + ";" +
            Environment.NewLine + Environment.NewLine;
    }
}

파일에서 컴파일하는 등의 다른 컴파일 옵션이 있습니다. 컴파일을 일괄 처리할 수도 있습니다. 즉, 여러 파일 또는 원본을 동시에 컴파일할 수 있습니다.

단계별 프로시저 예제

  1. 새 Visual C# .NET Windows 애플리케이션을 만듭니다. Form1 은 기본적으로 만들어집니다.

  2. Button 컨트롤을 Form1에 추가한 다음 Text 속성을 빌드로 변경 합니다.

  3. Form1에 다른 Button 컨트롤을 추가한 다음 Text 속성을 실행으로 변경합니다.

  4. Form1에 두 개의 TextBox 컨트롤을 추가하고, 두 컨트롤의 다중 줄 속성을 True로 설정한 다음, 각 컨트롤에 여러 줄의 텍스트를 붙여넣을 수 있도록 이러한 컨트롤의 크기를 조정합니다.

  5. 코드 편집기에서 Form1.cs 소스 파일을 엽니다.

  6. 클래스에서 Form1 다음 단추 클릭 처리기를 붙여넣습니다.

    private void button1_Click(object sender, System.EventArgs e)
    {
        CSharpCodeProvider codeProvider = new CSharpCodeProvider();
        ICodeCompiler icc = codeProvider.CreateCompiler();
        string Output = "Out.exe";
        Button ButtonObject = (Button)sender;
    
        textBox2.Text = "";
        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        //Make sure we generate an EXE, not a DLL
        parameters.GenerateExecutable = true;
        parameters.OutputAssembly = Output;
        CompilerResults results = icc.CompileAssemblyFromSource(parameters, textBox1.Text);
    
        if (results.Errors.Count > 0)
        {
            textBox2.ForeColor = Color.Red;
            foreach (CompilerError CompErr in results.Errors)
            {
                textBox2.Text = textBox2.Text +
                            "Line number " + CompErr.Line +
                            ", Error Number: " + CompErr.ErrorNumber +
                            ", '" + CompErr.ErrorText + ";" +
                            Environment.NewLine + Environment.NewLine;
            }
        }
        else
        {
            //Successful Compile
            textBox2.ForeColor = Color.Blue;
            textBox2.Text = "Success!";
            //If we clicked run then launch our EXE
            if (ButtonObject.Text == "Run") Process.Start(Output);
        }
    }
    

    파일의 시작 부분에서 다음 using 문을 추가합니다.

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. Form1.cs 생성자를 찾습니다Form1.

  8. 생성자에서 Form1 를 호출한 InitializeComponent 후 다음 코드를 추가하여 Form1에 추가한 두 단추에 단추 클릭 처리기를 연결합니다.

    public Form1()
    {
        InitializeComponent();
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Click += new System.EventHandler(this.button1_Click);
    }
    
  9. 프로젝트를 실행합니다. Form1이 로드되면 빌드 단추를 클릭합니다.

    참고

    컴파일러 오류가 발생합니다.

  10. 다음으로, 다음 텍스트를 텍스트 상자에 복사하여 기존 텍스트를 바꿉 있습니다.

    using System;
    namespace HelloWorld
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class HelloWorldClass
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                Console.ReadLine();
            }
        }
    }
    
  11. 빌드를 다시 클릭합니다. 컴파일에 성공해야 합니다.

  12. 실행을 클릭하면 코드가 컴파일되고 결과 실행 파일이 실행됩니다. 컴파일은 실행 중인 애플리케이션과 동일한 폴더에 저장된 Out.exe이라는 실행 파일을 만듭니다.

    참고

    텍스트 상자에서 코드를 수정하여 다른 컴파일러 오류를 볼 수 있습니다. 예를 들어 세미콜론 중 하나를 삭제하고 코드를 다시 빌드합니다.

  13. 마지막으로 텍스트 상자의 코드를 수정하여 콘솔 창에 다른 텍스트 줄을 출력합니다. 실행을 클릭하여 출력을 확인합니다.

참조