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

728x90
반응형

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
    }
}
728x90
반응형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요