说来惭愧,周末跟一个同事讨论.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 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();
}
}
第一步:添加引用
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();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现