첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ CodeDomProvider 클래스 : 런타임에서 C# 코드를 동적으로 컴파일하기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


Program.cs

 

 

using System;

using System.CodeDom.Compiler;

using System.Text;

 

namespace TestProject

{

    /// <summary>

    /// 프로그램

    /// </summary>

    class Program

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Private

 

        #region 프로그램 시작하기 - Main(argumentArray)

 

        /// <summary>

        /// 프로그램 시작하기

        /// </summary>

        /// <param name="argumentArray">인자 배열</param>

        private static void Main(string[] argumentArray)

        {

            Console.Title = "CodeDomProvider 클래스 : 런타임에서 C# 코드를 동적으로 컴파일하기";

 

            string code = @"

using System;

 

public class TestClass

{

    public static int Main()

    {

        return 10;

    }

 

    public static string TestMethod1()

    {

        return ""테스트 문자열"";

    }

 

    public string TestMethod2(string source)

    {

        return source;

    }

}";

 

            object result1 = ExecuteMethod(code, "TestClass", "Main", null);

 

            Console.WriteLine("Main 함수 실행 결과");

 

            Console.WriteLine(result1);

 

            object result2 = ExecuteMethod(code, "TestClass", "TestMethod1", null);

 

            Console.WriteLine("TestMethod1 함수 실행 결과");

 

            Console.WriteLine(result2);

 

            object result3 = ExecuteMethod(code, "TestClass", "TestMethod2", new object[] { "안녕하세요!" });

 

            Console.WriteLine("TestMethod2 함수 실행 결과");

 

            Console.WriteLine(result3);

        }

 

        #endregion

        #region 메소드 실행하기 - ExecuteMethod(code, className, methodName, methodaParameterArray)

 

        /// <summary>

        /// 메소드 실행하기

        /// </summary>

        /// <param name="code">코드</param>

        /// <param name="className">클래스명</param>

        /// <param name="methodName">메소드명</param>

        /// <param name="methodaParameterArray">메소드 매개 변수 배열</param>

        /// <returns>메소드 실행 결과</returns>

        private static object ExecuteMethod(string code, string className, string methodName, object[] methodaParameterArray)

        {

            using(CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"))

            {

                 CompilerParameters parameters = new CompilerParameters()

                 {

                    CompilerOptions         = "/optimize",

                    GenerateExecutable      = false,

                    GenerateInMemory        = true,

                    IncludeDebugInformation = false,

                    TreatWarningsAsErrors   = true

                };

        

                CompilerResults results = provider.CompileAssemblyFromSource(parameters, new string[] { code });

        

                if(results.Errors.Count > 0)

                {

                    StringBuilder stringBuilder = new StringBuilder();

 

                    stringBuilder.AppendLine("컴파일 에러 : ");

 

                    foreach(CompilerError error in results.Errors)

                    {

                        stringBuilder.AppendLine(error.ErrorText);

                    }

            

                    throw new ArgumentException("컴파일 에러", stringBuilder.ToString());

                }

        

       

                Type testClassType = results.CompiledAssembly.GetType(className);

 

                object testClassInstance = Activator.CreateInstance(testClassType);

 

                object result = testClassType.GetMethod(methodName).Invoke

                (

                    testClassInstance,

                    methodaParameterArray

                );

 

                return result;

            }

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요