简单的C 简单的C调吉他弹奏曲子有哪些
创始人
2024-04-25 19:31:55
0

1、C#代码解释器简介

能够动态执行 C#代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C#代码,然后程序自动编译并执行这一行代码,将结果显示给我们。这差不多就是一个最简单的 C#代码解释器了。

动态执行 C#代码又是一件很有用的功能,比如,我们可以将某些代码写在某个文件之中,由程序集在执行时进行加载,改变这些代码不用中止程序,当程序再次加载这些代码时,就自动执行的是新代码了。

2、简单的 C#代码解释器

  1. usingSystem;  
  2. usingSystem.Collections.Generic;  
  3. usingSystem.Reflection;  
  4. usingSystem.Globalization;  
  5. usingMicrosoft.CSharp;  
  6. usingSystem.CodeDom;  
  7. usingSystem.CodeDom.Compiler;  
  8. usingSystem.Text;  
  9. usingSystem.IO;  
  10. usingSystem.Xml;  
  11.  
  12. namespaceTest  
  13. {  
  14. classProgram  
  15. {  
  16. staticvoidMain(string[]args)  
  17. {  
  18. Console.Write(">>");  
  19. Stringcmd;  
  20. Contextcxt=newContext();  
  21. while((cmd=Console.ReadLine().Trim())!="exit")  
  22. {  
  23. if(!String.IsNullOrEmpty(cmd))  
  24. {  
  25. Console.WriteLine();  
  26. cxt.Invoke(cmd);  
  27. }  
  28. Console.Write("\n>>");  
  29. }  
  30. }  
  31. }  
  32.  
  33. publicclassContext  
  34. {  
  35. publicCSharpCodeProviderCodeProvider{get;set;}  
  36. publicIDictionary,Assembly>Assemblys{get;set;}  
  37.  
  38. publicContext()  
  39. {  
  40. CodeProvider=newCSharpCodeProvider(newDictionary,string>()
    {{"CompilerVersion","v3.5"}});  
  41. Assemblys=newDictionary,Assembly>();  
  42. Assembly[]al=AppDomain.CurrentDomain.GetAssemblies();  
  43. foreach(Assemblyainal)  
  44. {  
  45. AddAssembly(a);  
  46. }  
  47. AppDomain.CurrentDomain.AssemblyLoad+=newAssemblyLoadEventHandler
    (CurrentDomain_AssemblyLoad);  
  48. }  
  49.  
  50. privatevoidAddAssembly(Assemblya)  
  51. {  
  52. if(a!=null)  
  53. {  
  54. Assemblys.Add(a.FullName,a);  
  55. }  
  56. }  
  57.  
  58. voidCurrentDomain_AssemblyLoad(objectsender,AssemblyLoadEventArgsargs)  
  59. {  
  60. Assemblya=args.LoadedAssembly;  
  61. if(!Assemblys.ContainsKey(a.FullName))  
  62. {  
  63. AddAssembly(a);  
  64. }  
  65. }  
  66.  
  67. publicCompilerParametersCreateCompilerParameters()  
  68. {  
  69. CompilerParameterscp=newCompilerParameters();  
  70. cp.GenerateExecutable=false;  
  71. cp.GenerateInMemory=true;  
  72. if(Assemblys!=null)  
  73. {  
  74. foreach(AssemblyainAssemblys.Values)  
  75. {  
  76. cp.ReferencedAssemblies.Add(a.Location);  
  77. }  
  78. }  
  79. returncp;  
  80. }  
  81.  
  82. publicvoidInvoke(Stringcmd)  
  83. {  
  84. StringinputCmdString=cmd.Trim();  
  85. if(String.IsNullOrEmpty(inputCmdString))return;  
  86.  
  87. StringfullCmd=BuildFullCmd(inputCmdString);  
  88.  
  89. CompilerResultscr=CodeProvider.CompileAssemblyFromSource
    (CreateCompilerParameters(),fullCmd);  
  90.  
  91. if(cr.Errors.HasErrors)  
  92. {  
  93. BooleanrecompileSwitch=true;  
  94.  
  95. foreach(CompilerErrorerrincr.Errors)  
  96. {  
  97. //CS0201:Onlyassignment,call,increment,decrement,andnewobjectexpressionscanbe  
  98. //usedasastatement  
  99. if(!err.ErrorNumber.Equals("CS0201"))  
  100. {  
  101. recompileSwitch=false;  
  102. break;  
  103. }  
  104. }  
  105.  
  106. //重新编译  
  107. if(recompileSwitch)  
  108. {  
  109. StringdynaName="TempArg_Dynamic_"+DateTime.Now.Ticks.ToString();  
  110. inputCmdString=String.Format("var{0}=",dynaName)+inputCmdString;  
  111. inputCmdString+=";\nSystem.Console.WriteLine("+dynaName+");";  
  112.  
  113. fullCmd=BuildFullCmd(inputCmdString);  
  114. cr=CodeProvider.CompileAssemblyFromSource(CreateCompilerParameters(),fullCmd);  
  115. }  
  116.  
  117. if(cr.Errors.HasErrors)  
  118. {  
  119. Console.WriteLine("编译错误:");  
  120. foreach(CompilerErrorerrincr.Errors)  
  121. {  
  122. Console.WriteLine(err.ErrorNumber);  
  123. Console.WriteLine(err.ErrorText);  
  124. }  
  125.  
  126. return;  
  127. }  
  128. }  
  129.  
  130. Assemblyassem=cr.CompiledAssembly;  
  131. ObjectdynamicObject=assem.CreateInstance("Test.DynamicClass");  
  132. Typet=assem.GetType("Test.DynamicClass");  
  133. MethodInfominfo=t.GetMethod("MethodInstance");  
  134. minfo.Invoke(dynamicObject,null);  
  135. }  
  136.  
  137. privateStringBuildFullCmd(StringinputCmdString)  
  138. {  
  139. StringStringfullCmd=String.Empty;  
  140.  
  141. fullCmd+=@"  
  142. namespaceTest  
  143. {  
  144. publicclassDynamicClass  
  145. {  
  146. publicvoidMethodInstance()  
  147. {  
  148. "+inputCmdString+@";  
  149. }  
  150. }  
  151. }";  
  152. returnfullCmd;  
  153. }  
  154. }  

【编辑推荐】

  1. 分析C#不安全代码
  2. 浅析C#调用ImageAnimator
  3. C#连接Access、SQL Server数据库
  4. 浅谈C#固定的和活动的变量
  5. 介绍C#中的值类型

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...