C#代码解释器
来源:互联网 发布:连接Mac 编辑:程序博客网 时间:2024/05/10 14:15
1、C#代码解释器简介
能够动态执行 C#代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C#代码,然后程序自动编译并执行这一行代码,将结果显示给我们。这差不多就是一个最简单的 C#代码解释器了。
动态执行 C#代码又是一件很有用的功能,比如,我们可以将某些代码写在某个文件之中,由程序集在执行时进行加载,改变这些代码不用中止程序,当程序再次加载这些代码时,就自动执行的是新代码了。
2、简单的 C#代码解释器
ASDF
usingSystem; usingSystem.Collections.Generic; usingSystem.Reflection; usingSystem.Globalization; usingMicrosoft.CSharp; usingSystem.CodeDom; usingSystem.CodeDom.Compiler; usingSystem.Text; usingSystem.IO; usingSystem.Xml; namespaceTest { classProgram { staticvoidMain(string[]args) { Console.Write(">>"); Stringcmd; Contextcxt=newContext(); while((cmd=Console.ReadLine().Trim())!="exit") { if(!String.IsNullOrEmpty(cmd)) { Console.WriteLine(); cxt.Invoke(cmd); } Console.Write("\n>>"); } } } publicclassContext { publicCSharpCodeProviderCodeProvider{get;set;} publicIDictionary<String,Assembly>Assemblys{get;set;} publicContext() { CodeProvider=newCSharpCodeProvider(newDictionary<string,string>(){{"CompilerVersion","v3.5"}}); Assemblys=newDictionary<String,Assembly>(); Assembly[]al=AppDomain.CurrentDomain.GetAssemblies(); foreach(Assemblyainal) { AddAssembly(a); } AppDomain.CurrentDomain.AssemblyLoad+=newAssemblyLoadEventHandler(CurrentDomain_AssemblyLoad); } privatevoidAddAssembly(Assemblya) { if(a!=null) { Assemblys.Add(a.FullName,a); } } voidCurrentDomain_AssemblyLoad(objectsender,AssemblyLoadEventArgsargs) { Assemblya=args.LoadedAssembly; if(!Assemblys.ContainsKey(a.FullName)) { AddAssembly(a); } } publicCompilerParametersCreateCompilerParameters() { CompilerParameterscp=newCompilerParameters(); cp.GenerateExecutable=false; cp.GenerateInMemory=true; if(Assemblys!=null) { foreach(AssemblyainAssemblys.Values) { cp.ReferencedAssemblies.Add(a.Location); } } returncp; } publicvoidInvoke(Stringcmd) { StringinputCmdString=cmd.Trim(); if(String.IsNullOrEmpty(inputCmdString))return; StringfullCmd=BuildFullCmd(inputCmdString); CompilerResultscr=CodeProvider.CompileAssemblyFromSource(CreateCompilerParameters(),fullCmd); if(cr.Errors.HasErrors) { BooleanrecompileSwitch=true; foreach(CompilerErrorerrincr.Errors) { //CS0201:Onlyassignment,call,increment,decrement,andnewobjectexpressionscanbe //usedasastatement if(!err.ErrorNumber.Equals("CS0201")) { recompileSwitch=false; break; } } //重新编译 if(recompileSwitch) { StringdynaName="TempArg_Dynamic_"+DateTime.Now.Ticks.ToString(); inputCmdString=String.Format("var{0}=",dynaName)+inputCmdString; inputCmdString+=";\nSystem.Console.WriteLine("+dynaName+");"; fullCmd=BuildFullCmd(inputCmdString); cr=CodeProvider.CompileAssemblyFromSource(CreateCompilerParameters(),fullCmd); } if(cr.Errors.HasErrors) { Console.WriteLine("编译错误:"); foreach(CompilerErrorerrincr.Errors) { Console.WriteLine(err.ErrorNumber); Console.WriteLine(err.ErrorText); } return; } } Assemblyassem=cr.CompiledAssembly; ObjectdynamicObject=assem.CreateInstance("Test.DynamicClass"); Typet=assem.GetType("Test.DynamicClass"); MethodInfominfo=t.GetMethod("MethodInstance"); minfo.Invoke(dynamicObject,null); } privateStringBuildFullCmd(StringinputCmdString) { StringStringfullCmd=String.Empty; fullCmd+=@" namespaceTest { publicclassDynamicClass { publicvoidMethodInstance() { "+inputCmdString+@"; } } }"; returnfullCmd; } } }
- C#代码解释器
- c#,解释和执行c#代码;
- 解释器的代码....
- 音乐播放器代码解释
- C#结构体和类的区别 代码实例解释
- dalvik虚拟机解释器高频解释代码的加速
- C#数学运算表达式解释器
- C#设计模式—解释器模式
- cacu解释器类C脚本代码
- acu解释器类C脚本代码
- C# 解释配置文件内容
- C# 非托管 解释
- C#解释json
- c#中[STAThread]解释
- C# [..]的解释
- C# internal牛解释
- C#解释Json格式文件
- C#数组详细解释
- Linux之压缩及解压缩命令tar的使用
- SOA(wso2+tuscany)新框架开发部署规范
- objdump
- CROC 2013 Round 1
- Myeclipse查看类定义、层次和源码
- C#代码解释器
- WIN7下图标在任务栏显示不正常的解决办法
- "$err" : "not master and slaveok=false", "code" : 13435
- 基本数据类型----整型数据
- 程序员笑话一则——逛银饰店(关注一下你周围可爱的程序员)
- 常用WebService一览表(一)
- PART1
- 个人部分理解部分,后续理解再添加:STL中map的实现
- hdu 2066(一个人的旅行)