반응형

* C# 소스코드를 동적으로 컴파일 하는 예제

 

기본 메인화면

Form1.cs

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.CodeDom.Compiler;
using System.Runtime.InteropServices;

namespace CSharp_동적컴파일
{
    public partial class Form1 : Form
    {
        //API 선언 (다른 프로그램 실행 시키키 위한 변수)
        [DllImport("Shell32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);

        public Form1()
        {
            InitializeComponent();

            textBox1.Text = @"using System;

                                namespace Zmeun.CodeDom
                                {
                                    class CodeDomTest
                                    {
                                        static void Main(string[] args)
                                        {
                                            System.Console.WriteLine(""Hello World!"");
                                            System.Console.WriteLine(""Press the Enter key to continue."");
                                            System.Console.ReadLine();
                                        }
                                    }
                                }";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("c#");
            CompilerParameters compilerParameters = new CompilerParameters();

            //.GenerateExecutable 이값을 'false'로 하면 dll로 출력됨
            compilerParameters.GenerateExecutable = true;
            //컴파일 된 EXE 파일 출력 Path
            compilerParameters.OutputAssembly = @"c:\test.exe";
            CompilerResults compilerResults = codeDomProvider.CompileAssemblyFromSource(compilerParameters, textBox1.Text );

            if (compilerResults.Errors.Count > 0)
            {
                textBox1.Text = compilerResults.Errors[0].ToString();
            }
            else
            {
                textBox1.Text = "성공";
            }
            
            //컴파일된 프로그램 실행 시키기...
            ShellExecute(this.Handle, "open", "C:\\test.exe", "", "", 4);

        }
    }
}

 

실행 결과

 

 

반응형

+ Recent posts