简单的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. }  
  155. } 

【编辑推荐】

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

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...