.net 动态编译 1

收集

第一步:添加引用

using System.Reflection;

using Microsoft.CSharp;

using System.CodeDom.Compiler;

第二步:创建需要编译的代码

string MyCodeString=@"

public class MyTest

{

    public static string GetTestString()

    {

        string MyStr = ""This is a Dynamic Compiler Demo!"";

        return MyStr;

    }

}";

第三步:实现动态编译

CompilerParameters compilerParams = new CompilerParameters();

       

 ///编译器选项设置

compilerParams.CompilerOptions = "/target:library /optimize";

 

///编译时在内存输出

compilerParams.GenerateInMemory = true;

 

///生成调试信息

compilerParams.IncludeDebugInformation = false;

       

 ///添加相关的引用

compilerParams.ReferencedAssemblies.Add("mscorlib.dll");

compilerParams.ReferencedAssemblies.Add("System.dll");

 

ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler();

 

///编译

CompilerResults results = compiler.CompileAssemblyFromSource(compilerParams,MyCodeString);

第四步:输出编译结果

///创建程序集

Assembly asm = results.CompiledAssembly;

       

///获取编译后的类型

object objMyTestClass = asm.CreateInstance("MyTest");

Type MyTestClassType=objMyTestClass.GetType();

 

///输出结果

Console.WriteLine(MyTestClassType.GetMethod("GetTestString").Invoke(objMyTestClass,null));

Console.ReadLine();

至此,一个简单的动态编译程序就完了,我们看到输出的结果为:

This is a Dynamic Compiler Demo!

完整的程序清单:

using System;

 

using System.Reflection;

using Microsoft.CSharp;

using System.CodeDom.Compiler;

 

public class MyDynamicCompiler

{

    public static void Main()

    {  

        ///需要编译的字符串

        string MyCodeString=@"

        public class MyTest

        {

            public static string GetTestString()

            {

                string MyStr = ""This is a Dynamic Compiler Demo!"";

                return MyStr;

            }

        }";

 

        CompilerParameters compilerParams = new CompilerParameters();

       

        ///编译器选项设置

        compilerParams.CompilerOptions = "/target:library /optimize";

 

        ///编译时在内存输出

        compilerParams.GenerateInMemory = true;

 

        ///生成调试信息

        compilerParams.IncludeDebugInformation = false;

       

        ///添加相关的引用

        compilerParams.ReferencedAssemblies.Add("mscorlib.dll");

        compilerParams.ReferencedAssemblies.Add("System.dll");

 

        ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler();

 

        ///编译

        CompilerResults results = compiler.CompileAssemblyFromSource(compilerParams,MyCodeString);

       

        ///创建程序集

        Assembly asm = results.CompiledAssembly;

       

        ///获取编译后的类型

        object objMyTestClass = asm.CreateInstance("MyTest");

        Type MyTestClassType=objMyTestClass.GetType();

 

        ///输出结果

        Console.WriteLine(MyTestClassType.GetMethod("GetTestString").Invoke(objMyTestClass,null));

        Console.ReadLine();

    }

}

posted @ 2006-02-17 20:13  U2U  阅读(1577)  评论(2)    收藏  举报