Mono C#评估者 - 重定向脚本控制台输出

时间:2017-11-10 11:38:41

标签: c# mono

我使用Mono.CSharp.Evaluator类来运行C#脚本,并希望在我的脚本中使用Console.WriteLine()Debug.WriteLine()语句。有没有办法将这样的输出重定向回" hosting"应用?

代码段: -

var sb = new StringBuilder();
var reportWriter = new StringWriter(sb);
var reportPrinter = new ConsoleReportPrinter(reportWriter);
var compilerContext = new CompilerContext(settings, reportPrinter);
var evaluator = new Evaluator(compilerContext);

evaluator.Run("Console.WriteLine(""Hello!"");");

鉴于它的名称我希望ConsoleReportPrinter可能是为此目的而设计的,但我在这里看到的任何东西(实际上是它写的StringBuilder)都是在脚本中报告语法错误。

2 个答案:

答案 0 :(得分:0)

在进一步挖掘之后,我想出了一个解决方案......

Evaluator使用"交互式基类" (我认为)充当正在执行的脚本的包装器(此类通过Evaluator.InteractiveBaseClass属性公开)。

查看源代码,默认为名为InteractiveBase的类,该类具有名为"输出"的静态 TextWriter属性,其值默认为"控制台.OUT&#34 ;.我所做的是将自己的Stringwriter分配给它,这允许我将输出捕获到我现有的StringBuilder:

var outputStringWriter = new StringWriter(sb);
InteractiveBase.Output = _outputStringWriter;

这仍然不允许我在脚本中使用Console.WriteLine(),但脚本可以访问"交互式基类的任何属性或方法&#34 ;所以在我的剧本中我可以打电话:

Output.WriteLine("...");

答案 1 :(得分:0)

在将我自己的打印函数作为局部变量注入时,我发现已经有一个全局方法 print(object value) 可以调用它写入标准输出。