C# 对动态编辑的一些学习笔记

时间:2023-03-09 17:28:30
C#  对动态编辑的一些学习笔记
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace CompilerTest
{
// Compiler
class MyCompilter
{
// Provider
private Microsoft.CSharp.CSharpCodeProvider Provider;
// CompilerParameters
private System.CodeDom.Compiler.CompilerParameters cps;
// Default Libs
public string[] defaultLibs = { "System.dll" }; // Singleton
private static MyCompilter instance = null;
private MyCompilter() {
Provider = new Microsoft.CSharp.CSharpCodeProvider();
}
public static MyCompilter Instance() {
if (instance == null) {
instance = new MyCompilter();
}
return instance;
} // CompilerParameters
private void CreateCps(string[] libs) {
// 编译参数
cps = new System.CodeDom.Compiler.CompilerParameters();
// 是否生成 Exe 文件
cps.GenerateExecutable = false;
// 生成在内存中
cps.GenerateInMemory = true;
// 添加引用
cps.ReferencedAssemblies.AddRange(defaultLibs);
if (libs != null) {
cps.ReferencedAssemblies.AddRange(libs);
} // 将 生成的 的 Dll 文件,保存到硬盘中
cps.OutputAssembly = "d:/tmp.dll";
} // Eval String
public System.Reflection.Assembly Compile(string[] Sources, string[] libs = null) {
// Compiler Results
System.CodeDom.Compiler.CompilerResults cr;
// Create Compiler Parameters
CreateCps(libs);
// 开始编译
cr = Provider.CompileAssemblyFromSource(cps, Sources); // 如果没有错误的话. 将 生成的 Assembly 返回
if (cr.Errors.Count == ) {
return cr.CompiledAssembly;
}
return null;
}
} class Program
{
static void Main(string[] args) {
string code = @"
using System; class ExpressionCalculate
{
public void Calculate()
{
Console.WriteLine(""kaoooooo,asdfl"");
}
}
";
string code2 = @"
using System; class ExpressionCalculate2
{
public void Calculate2()
{
Console.WriteLine(""kaooortrtrtrtooo,atytytysdfl"");
}
}
"; // 对字符串,进行编译
System.Reflection.Assembly type = MyCompilter.Instance().Compile(new string[] { code,code2 });
// 通过,编译后得到的 Assembly 反射创建其中的一个类,得到一个 Object 类型的对象
object obj = type.CreateInstance("ExpressionCalculate2");
// 通过 这个 Obj 的 GetType().GetMethod() 方法 按名称得到它的里面的方法
System.Reflection.MethodInfo method = obj.GetType().GetMethod("Calculate2");
// 调用这个方法
method.Invoke(obj, null);
}
}
}