有没有人知道是否有办法在运行时评估c#代码。 例如。我想允许用户输入DateTime.Now.AddDays(1)或类似的东西作为字符串,然后评估字符串以获得结果。
我是否可以访问emmediate windows功能,因为它似乎评估了动态输入的每一行。
我发现VB有一个来自VBA * .dll的未记录的EbExecuteLine()API函数,并想知道是否有类似于c#的东西。
我还发现了一个自定义工具https://github.com/DavidWynne/CSharpEval(曾经是kamimucode.com,但作者已将其移至GitHub)似乎已经做到了,但我更喜欢作为其中一部分的东西。 NET
由于
答案 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)上看到