Mono - Compiler as Service,如何创建编译类的实例

时间:2012-02-16 19:12:31

标签: compiler-construction mono

我正在使用这个简单的程序: -

var evaluator = new Evaluator(
  new CompilerSettings(),
  new Report(new ConsoleReportPrinter()));

// Make it reference our own assembly so it can use IFoo
evaluator.ReferenceAssembly(typeof(IFoo).Assembly);

// Feed it some code
evaluator.Compile(
            @"
public class Foo : MonoCompilerDemo.IFoo
{
    public string Bar(string s) { return s.ToUpper(); }
}");

有没有办法,我可以在主程序中使用已编译类foo的实例。编译中有一个需要委托的重载,但我无法理解它的用法

2 个答案:

答案 0 :(得分:2)

我一直在寻找类似的解决方案,没有找到任何运气。直到我做了这样的事情......

Assembly asm = ((Type)evaluator.Evaluate("typeof(Foo);")).Assembly;
dynamic script = asm.CreateInstance("Foo");
script.Bar("hello")

给出这个简单程序的代码片段。 script.Bar("hello")会产生“HELLO”

答案 1 :(得分:0)

为什么不将此片段添加到正在执行的代码中以编译您的类?

// define class Foo like you already did
return typeof(Foo);

然后

var type = (Type)evaluator.Compile(...
var myFooInstance = Activator.CreateInstance(type);

甚至更好,只需编译一个"工厂方法"进入你的代码:)

// define class Foo like you already did
return new Func<IFoo>(() => new Foo());

然后&#34;外面&#34;您只需将返回的值转换回Func<IFoo>并使用它:

var fooFactory = (Func<IFoo>)evaluator.Compile(...
var instance = fooFactory();