我正在使用这个简单的程序: -
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的实例。编译中有一个需要委托的重载,但我无法理解它的用法
答案 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();