상세 컨텐츠

본문 제목

[C#] 동적 컴파일

C#

by 메타샤워 2023. 7. 18. 18:44

본문

.NET에서 제공하는 컴파일 서비스를 이요하면 C#이나 VB.NET코드등을 동적으로 컴파일해서 .exe나 .dll등을 빌드할수 있다.

.NET의 CodeDomProvider 클래스는 이러한 동적 컴파일 (Dynamic Compilation)기능을 제공하는데,
CodeComProvider.CreatePrivider()를 사용하여 해당 언어에 대한 컴파일러 객체를 생성하고, 
필요한 컴파일 옵션등을 지정하게 된다. ( 예를들어 .exe 를 만들건지 .dll을 만들건지 )
실제 컴파일 빌드를 하는 메서드는 직접 
문자열로부터 컴파일 하는 CompileAssemblyFromSource(), 
파일로부터 컴파일 하는CompileAssemblyFromFile(),
그리고 DOM 트리부터 컴파일 하는 CompileAssemblyFromDom() 등이 있다.
아래 예제는 C#코드가 들어있는 문자열로부터 컴파일 하여 test.exe 라는 실행 파일을 만드는 간단한 예이다.
 
using System;  
using System.CodeDom.Compiler;  
using System.Diagnostics;  
  
namespace CSCompile  
{  
  class Program  
  {  
    static void Main(string[] args)  
    {  
        // 컴파일할 코드  
        string code = @" 
            using System;  
            namespace TEST  
            { 
                class Program 
                { 
                    static void Main(string[] args) 
                    { 
                        int sum = 0; 
                        for (int i = 0; i < 100; i++) 
                        { 
                            sum += i; 
                        } 
                        Console.WriteLine(sum); 
                        Console.ReadLine(); 
                    } 
                } 
            } 
            ";  
  
        // C# 컴파일러 객체 생성  
        CodeDomProvider codeDom = CodeDomProvider.CreateProvider("CSharp");  
  
        // 컴파일러 파라미터 옵션 지정  
        CompilerParameters cparams = new CompilerParameters();  
        cparams.GenerateExecutable = true;  
        cparams.OutputAssembly = "Test.exe";  
  
        // 소스코드를 컴파일해서 EXE 생성  
        CompilerResults results = codeDom.CompileAssemblyFromSource(cparams, code);  
  
        // 컴파일 에러 있는 경우 표시  
        if (results.Errors.Count > 0)  
        {  
            foreach (var err in results.Errors)  
            {  
                Console.WriteLine(err.ToString());  
            }  
            return;  
        }  
  
        // (Optional) 테스트 실행  
        Process.Start("Test.exe");              
    }  
  }  
}
VB.NET을 컴파일 하고 싶다면 컴파일러 객체 생성 구문에서
CodeDomProvider.CreateProvider("VisualBasic");
라고 지정해주면 된다.

관련글 더보기