Mono - Compiler as Service, как создать экземпляр скомпилированного класса - PullRequest
1 голос
/ 16 февраля 2012

Я использую эту простую программу: -

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 ]

2 голосов
/ 03 декабря 2013

Я искал подобное решение, и мне не повезло найти что-либо.Пока я не сделал что-то подобное ...

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

Учитывая этот фрагмент с простой программойscript.Bar("hello") будет производить "Привет"

0 голосов
/ 17 февраля 2017

Почему бы просто не добавить этот фрагмент в код, который вы выполняете для компиляции вашего класса?

// 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());

и затем "снаружи" вы просто приводите возвращенное значение обратно в Func<IFoo> и используете его:

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