Hi,<div><br></div><div>I'm currently implementing REPL functionality in my app that embeds mono runtime (3.0.1), and I've encountered some issues when evaluating code that contains dynamic invocation.</div><div><br>
</div><div>For example, consider this simple dynamic class:</div><div><br></div><div><div><span class="" style="white-space:pre">     </span>public class Foo : DynamicObject {</div><div><span class="" style="white-space:pre">         </span>public override bool TryGetMember(GetMemberBinder binder, out object result)<span style="white-space:pre"> </span>{</div>
<div><span class="" style="white-space:pre">                    </span>result = 5;</div><div><span class="" style="white-space:pre">                        </span>return true;</div><div><span class="" style="white-space:pre">               </span>}</div><div><span class="" style="white-space:pre">  </span>}</div>
</div><div><br></div><div>The following Evaluator initialization:</div><div><br></div><div><div>        var settings = new CompilerSettings();</div><div>        var printer = new ConsoleReportPrinter();</div><div>        eval = new Evaluator(new CompilerContext(settings, printer));</div>
<div>        eval.ReferenceAssembly(typeof(REPL).Assembly);</div><div>        eval.Run("using System;");</div></div><div><br></div><div>And the evaluation</div><div><br></div><div>        dynamic f = new Program.Foo();</div>
<div>        f.Whatever;</div><div><br></div><div>gives following error:</div><div><br></div><div><div>error CS0518: The predefined type Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported (1,4): error CS1969: Dynamic operation cannot be compiled without `Microsoft.CSharp.dll' assembly reference.</div>
</div><div><br></div><div>So I went off and added following:</div><div>      eval.ReferenceAssembly(typeof(Microsoft.CSharp.RuntimeBinder.Binder).Assembly);<br></div><div><br></div><div>which now gave following warning:</div>
<div><br></div><div><div>warning CS1685: The predefined type `Microsoft.CSharp.RuntimeBinder.Binder' is d</div><div>efined multiple times. Using definition from `Microsoft.CSharp.dll'</div></div><div><br></div><div>
What I ended up using was to just use one of the types from Microsoft.CSharp assembly in my code, before even calling Evaluator (to force the runtime to load the types into the assembly), something like:</div><div><br></div>
<div>var r = Microsoft.CSharp.RuntimeBinder.Binder.IsEvent(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags.BinaryOperationLogical, "gf", typeof(int)); // just do whatever involving those types<br></div><div><br>
</div><div>Am I missing some initialization option for Evaluator, or should I reference Microsoft.CSharp assembly like in the above code and just ignore the warning?</div>