可以在运行时解析和评估.NET
我觉得如果我能在运行时编写vb.net或c#代码会很有趣,而解释器会像python一样自动解析它,所以我做了一个小程序,它会做类似的事情。 基本上它看起来像这样:
InputArgs = Console.ReadLine() ParseInput(InputArgs.Split(" ")) Private Sub ParseInput(Args as List(Of String), Optional TempArgs as List(Of String)) Dim arg as string = Args(0) If arg = ".." then ... elseif arg = ".." then ... end if End Sub
我知道这不是一个好的系统,但它显示了基础知识。 所以我的问题是:是否有可能使vb.net或c#像python一样 – 在运行时解释?
这已经存在于相当多的形状和forms:
Mono.CSharp
Mono有Mono.CSharp
程序集,您可以引用它来执行任何CSharp.exe(AC#’interpreter’或交互式shell,如果您愿意)可以执行的操作:
void ReadEvalPrintLoopWith (ReadLiner readline) { string expr = null; while (!InteractiveBase.QuitRequested){ string input = readline (expr == null); if (input == null) return; if (input == "") continue; expr = expr == null ? input : expr + "\n" + input; expr = Evaluate (expr); } }
毋庸置疑, 这也适用于MS.Net (当然,这是关于便携式.Net的观点)。
github上有完整的消息来源 – 就像其他的Mono一样。
DLR
已经实施了几种DLR语言,包括但不限于
- IronRuby的
- IronPython的
- Jint(http://jint.codeplex.com/) – 在.Net 2.0上运行javascript
它允许您在.NET框架中动态评估python / ruby代码。
罗斯林
Microsoft已将Roslyn发布为CTP(预览版)。 它基本上可以做与Mono REPL(第一项)相同的东西,以及(更多)。 但它仍然是预览。
它可以,但这将是很多工作。
一种方法是自己编写解析器+解释器。 要创建解析器,您需要输入语言的语法定义,例如C#。 请注意,C#语法非常复杂。
另一种方法是动态编译C#代码。 以下是如何执行此操作的示例: http : //www.voidspace.org.uk/ironpython/dynamically_compiling.shtml和http://blogs.msdn.com/b/saveenr/archive/2009/08/11/ a-walkthrough-of-dynamic-compiling-c-code.aspx 。
祝好运!
没有太多时间给你一个正确的答案,但这里是我的一个旧项目的eval代码:
CSharpCodeProvider c = new CSharpCodeProvider(); ICodeCompiler icc = c.CreateCompiler(); CompilerParameters cp = new CompilerParameters(); cp.ReferencedAssemblies.Add("system.dll"); cp.ReferencedAssemblies.Add("system.xml.dll"); cp.ReferencedAssemblies.Add("system.data.dll"); cp.ReferencedAssemblies.Add("system.windows.forms.dll"); cp.ReferencedAssemblies.Add("system.drawing.dll"); cp.CompilerOptions = "/t:library"; cp.GenerateInMemory = true; StringBuilder sb = new StringBuilder(""); sb.Append("using System;\n"); sb.Append("using System.Xml;\n"); sb.Append("using System.Data;\n"); sb.Append("using System.Data.SqlClient;\n"); sb.Append("using System.Windows.Forms;\n"); sb.Append("using System.Drawing;\n"); sb.Append("namespace CSCodeEvaler{ \n"); sb.Append("public class CSCodeEvaler{ " + csCode + "} }"); CompilerResults cr = icc.CompileAssemblyFromSource(cp, sb.ToString()); if (cr.Errors.Count > 0) { MessageBox.Show("ERROR: " + cr.Errors[0].ErrorText, "Error evaluating cs code", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } System.Reflection.Assembly a = cr.CompiledAssembly; object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler"); Type t = o.GetType(); MethodInfo mi = t.GetMethod("Transform"); return mi;
此代码的原始变体取自: http : //www.codeproject.com/KB/cs/evalcscode.aspx
它编译了一些C#代码(代码应该在csCode
变量中),然后尝试在其中找到Transform()方法并返回它的MethodInfo,这样我们就可以执行它了。
但请记住,每次调用此代码时,都会加载一个新程序集,因此请不要经常使用它。
此外,正如普雷斯科特所说 – 试试罗斯林
希望这会有所帮助。 很抱歉,没有提供更具体问题的代码示例。
PS。 如果你想要一些交互式窗口,有第三方控件(使用谷歌查找,因为我不记得确切的产品名称)
你在重新发明LinqPad吗?
LinqPad是一款免费的符合人体工程学的C#/ VB / F#暂存器 ,可立即执行任何具有丰富输出格式的表达式,语句块或程序。 这很棒。
如果你真的想开发自己的,请看一些类似的现有问题一 两三 四 ……
所以我的问题是:是否有可能使vb.net或c#像python一样 – 在运行时解释?
当然。 开始为它编写解释器,然后你就可以解释它了。 从一个很好的语法分析器开始。 然后从那里继续。
不是我知道..但作为一个黑客,你可以创建一个textarea,它有一个TextChanged事件处理程序调用编译器程序(不知道它在哪里)。