menu 纱雾の抱枕
动态解析 C# 并映射调用动态生成的函数
9 浏览 | 2021-05-02 | 阅读时间: 约 1 分钟 | 分类: 计算机 | 标签: C#,笔记,对象映射,动态解析

背景

最近在写基于 C# 的即时编译器,于是就想到了这个,无事发 Blog 分享下。

实现

在开头加上

using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

然后嵌入下面的代码到你的程序中

static void DynamicRun(string Code)
{
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
CompilerParameters objCompilerParameters = new CompilerParameters();
// 在这加上需要依赖的库
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;
CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, Code);
if (cr.Errors.HasErrors)
{
Console.WriteLine("编译错误:");
foreach (CompilerError err in cr.Errors)
{
// 输出错误
Console.WriteLine(err.ErrorText);
}
}
else
{
// 通过反射动态调用
Assembly objAssembly = cr.CompiledAssembly;
// 在这里设置入口点类
object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
// 在这里设置入口点函数
MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
objMI.Invoke(objHelloWorld, null);
}
}

雷区

记得这个方案必须要把入口点类定义为 public class ,入口函数定义为 public static void (){...} !
不然会出错!这里的入口函数可以是 Static 函数,返回类型也不一定是 void,但是不建议加参数,如果要参数的话得改动上面的

objMI.Invoke(objHelloWorld, null);

这里的 null 为参数表!

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!