我正在使用Mono.CSharp.Evaluator类来运行C#脚本,并且希望在脚本中使用Console.WriteLine()或Debug.WriteLine()语句。有没有办法将这样的输出重定向回“托管”应用程序?
代码片段:-
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 )是报告脚本中的语法错误。
发布于 2017-11-10 20:25:04
经过进一步的挖掘,我想出了一个解决方案。
Evaluator利用了一个“交互式基类”,它(我认为)充当正在执行的脚本的包装器(这个类是通过Evaluator.InteractiveBaseClass属性公开的)。
看一下源代码,这默认是一个名为InteractiveBase的类,它有一个名为“TextWriter”的静态输出属性,其值默认为"Console.Out“。我所做的是将我自己的Stringwriter分配给它,它允许我捕获到现有StringBuilder的输出:
var outputStringWriter = new StringWriter(sb);
InteractiveBase.Output = _outputStringWriter;这仍然不能让我在脚本中使用Console.WriteLine(),但是脚本可以访问“交互式基类”的任何属性或方法,所以在我的脚本中我可以调用:
Output.WriteLine("...");发布于 2021-06-03 14:00:52
在将我自己的打印函数作为局部变量注入时,我发现已经有一个全局方法print(object value)可以调用,它可以写到std out。
https://stackoverflow.com/questions/47221972
复制相似问题