■ CodeDomProvider 클래스 : 런타임에서 C# 코드를 동적으로 컴파일하기
------------------------------------------------------------------------------------------------------------------------
▶ 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 } }
|
------------------------------------------------------------------------------------------------------------------------
'C# > Common' 카테고리의 다른 글
[C#/COMMON] IsolatedStorageFile 클래스 : 격리된 저장소에서 로그 파일에 로그 추가하기 (0) | 2020.08.21 |
---|---|
[C#/COMMON] Environment 클래스 : GetCommandLineArgs 정적 메소드를 사용해 명령행 인자 구하기 (0) | 2020.08.19 |
[C#/COMMON] 포맷 문자열을 사용해 숫자 앞에 0으로 채우기 (0) | 2020.08.18 |
[C#/COMMON] ManagementObject 클래스 : InvokeMethod 메소드를 사용해 디폴트 프린터 설정하기 (0) | 2020.08.18 |
[C#/COMMON] JavaScriptSerializer 클래스 : Serialize 메소드를 사용해 JSON 문자열 구하기 (0) | 2020.08.18 |
[C#/COMMON] CodeDomProvider 클래스 : 런타임에서 C# 코드를 동적으로 컴파일하기 (0) | 2020.08.09 |
[C#/COMMON] Regex 클래스 : IsMatch 정적 메소드를 사용해 IPV4 주소 검증하기 (0) | 2020.08.09 |
[C#/COMMON] Regex 클래스 : IsMatch 정적 메소드를 사용해 이메일 주소 검증하기 (0) | 2020.08.09 |
[C#/COMMON] Regex 클래스 : IsMatch 정적 메소드를 사용해 특수 문자 사용 여부 구하기 (0) | 2020.08.09 |
[C#/COMMON] 극 좌표 → 직교 좌표 변환하기 (0) | 2020.08.08 |
[C#/COMMON] 비트 단위 연산하기 (0) | 2020.08.06 |
댓글을 달아 주세요