有没有办法将动态编译后代码中的类的步骤赋给一个委托
有没有办法将动态编译后代码中的类的方法赋给一个委托?
比如上面这段动态编译, 有没有办法把里面的Hello方法赋给Func< >?
------解决方案--------------------
1.sb.Append(" Console.Writeline(\"Hello World!\");");
Writeline 的 L大写;
2.你代码后面加上
------解决方案--------------------
可以用表达式树,为了简化,我就省略了动态编译,给你演示:
CSharpCodeProvider provider = new CSharpCodeProvider();
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append("namespace TestName");
sb.Append("{");
sb.Append(" public class MyClass");
sb.Append(" {");
sb.Append(" public void Hello()");
sb.Append(" {");
sb.Append(" Console.Writeline(\"Hello World!\");");
sb.Append(" }");
sb.Append(" }");
sb.Append("}");
CompilerParameters param = new CompilerParameters();
param.GenerateExecutable = false;
param.GenerateInMemory = true;
CompilerResults result = provider.CompileAssemblyFromSource(param, sb.ToString());
比如上面这段动态编译, 有没有办法把里面的Hello方法赋给Func< >?
------解决方案--------------------
1.sb.Append(" Console.Writeline(\"Hello World!\");");
Writeline 的 L大写;
2.你代码后面加上
if (result.Errors.HasErrors)
return;
var assembly = result.CompiledAssembly;
var myClass = assembly.CreateInstance("TestName.MyClass");
myClass.GetType().GetMethod("Hello").Invoke(myClass, null);
------解决方案--------------------
可以用表达式树,为了简化,我就省略了动态编译,给你演示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class A
{
public void foo() { Console.WriteLine("hello"); }
}
class Program
{
static void Main(string[] args)
{
var newa = Expression.New(typeof(A));
var callfoo = Expression.Call(newa, typeof(A).GetMethod("foo"));
var lambda = Expression.Lambda<Action>(callfoo, new List<ParameterExpression>());
Action result = lambda.Compile();
result();
}
}
}