简单了解.NET中的动态编译机制
说来惭愧,周末跟一个同事讨论.NET中的动态编译,觉得实现起来可能有困难。一直不知道.NET Framework提供了一个代码文档对象模型(CodeDOM),可以动态的生成代码并动态编译,只是自己孤陋寡闻,没有用过罢了。这里简单的写一下实现步骤,有时间我会详细地写一下这方面的东西。
第一步:添加引用
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
{
///需要编译的字符串
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();
}
Worktile,新一代简单好用、体验极致的团队协同、项目管理工具,让你和你的团队随时随地一起工作。完全免费,现在就去了解一下吧。
https://worktile.com