C#动态代码评估,Eval,REPL

时间:2011-04-05 08:31:40

标签: c# dynamic eval read-eval-print-loop

有没有人知道是否有办法在运行时评估c#代码。 例如。我想允许用户输入DateTime.Now.AddDays(1)或类似的东西作为字符串,然后评估字符串以获得结果。

我是否可以访问emmediate windows功能,因为它似乎评估了动态输入的每一行。

我发现VB有一个来自VBA * .dll的未记录的EbExecuteLine()API函数,并想知道是否有类似于c#的东西。

我还发现了一个自定义工具https://github.com/DavidWynne/CSharpEval(曾经是kamimucode.com,但作者已将其移至GitHub)似乎已经做到了,但我更喜欢作为其中一部分的东西。 NET

由于

5 个答案:

答案 0 :(得分:1)

Mono具有交互式命令行(csharp.exe)

你可以查看它的源代码,看看它究竟是如何做到的:

https://github.com/mono/mono/raw/master/mcs/tools/csharp/repl.cs

答案 1 :(得分:1)

正如您可能已经看到的那样,在运行时没有用于评估C#代码的内置方法。这是您提到的自定义工具存在的主要原因。

我还有一个允许评估C#代码的C#eval程序。它提供了在运行时评估C#代码并支持许多C#语句。实际上,此代码可在任何.NET项目中使用,但是,它仅限于使用C#语法。有关其他详细信息,请查看我的网站http://csharp-eval.com

答案 2 :(得分:0)

Microsoft的C#编译器还没有Compiler-as-a-Service(应该附带C#5.0)。

您可以使用Mono's REPL,也可以使用CodeDOM

编写自己的服务

答案 3 :(得分:0)

它不是很快,但您可以动态编译代码,请参阅我的previous question

一旦你有了程序集并且你知道了类型名称,你可以使用反射构建编译类的实例并执行你的方法..

答案 4 :(得分:0)

O2平台的C# REPL Script Environment使用Fluent# API,它们具有真正强大的反射API,允许您执行代码段。

例如:

"return DateTime.Now.ToLongTimeString();".executeCodeSnippet(); 

将返回

5:01:22 AM

请注意,“...”。executeCodeSnippet(); 实际上可以执行任何有效的C#代码段(因此功能非常强大)。

如果您想控制用户可以执行的操作,我可以使用AST树来限制他们可以访问的C#功能。

另请查看微软的Roslyn,其功能非常强大,您可以在Multiple Roslyn based tools (all running Stand-Alone outside VisualStudio)上看到