成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

簡單的C#代碼解釋器

開發 后端
本文介紹簡單的C#代碼解釋器,我們可以在控制臺中輸入一行 C#代碼,然后程序自動編譯并執行這一行代碼,將結果顯示給我們。

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<String,Assembly>Assemblys{get;set;}  
  37.  
  38. publicContext()  
  39. {  
  40. CodeProvider=newCSharpCodeProvider(newDictionary<string,string>()
    {{"CompilerVersion","v3.5"}});  
  41. Assemblys=newDictionary<String,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#中的值類型
責任編輯:佚名 來源: 博客園
相關推薦

2009-08-13 17:36:54

編譯C#代碼

2009-08-31 17:53:20

C#實現索引器

2009-08-06 15:12:22

C#異常機制

2009-09-01 10:35:19

C# 3.0編譯器

2009-08-31 14:54:35

C#對象瀏覽器

2025-06-06 08:22:16

代碼C#開發

2013-06-05 10:11:20

索引器C#

2009-08-31 18:32:01

C# ListBoxE

2009-09-17 16:53:15

C#數組

2009-08-26 14:31:08

C#打印文件

2009-08-13 10:15:50

C#讀取Excel

2009-09-07 15:27:04

C# MessageB

2009-08-21 17:11:05

C#攝像頭

2009-08-19 10:09:21

C#和C++

2009-08-19 15:38:59

C#代碼

2009-08-27 15:34:38

C#命名空間

2009-08-27 18:05:54

C#索引功能

2009-08-31 18:24:26

編譯C#文件

2009-09-01 18:25:32

C#結構實例

2009-08-27 16:29:18

C#動態編譯
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区三区在线观看 | 日本久久久一区二区三区 | 久草新在线 | 国产成人精品久久二区二区91 | 成人在线视频免费观看 | 久久久久久91 | 国产精品免费一区二区三区四区 | 久久九 | 欧美日韩亚洲一区二区 | 精品国产欧美一区二区三区成人 | 国产福利视频网站 | 中文字字幕一区二区三区四区五区 | 久久综合久 | 97久久精品午夜一区二区 | 97精品国产97久久久久久免费 | 综合网在线 | 免费一级欧美在线观看视频 | www.亚洲.com| 国产亚洲欧美在线视频 | 最新中文字幕在线 | 成人精品视频免费 | 毛片在线视频 | 精品日韩一区二区 | 天天天天天操 | 国产欧美精品一区二区 | 99re6热在线精品视频播放 | 一级黄色片免费在线观看 | 欧美一级二级在线观看 | 亚洲三区在线观看 | 在线观看你懂的网站 | 成年视频在线观看 | 国产精品视频播放 | 不卡一二三区 | 在线观看中文字幕视频 | 最新免费av网站 | 亚洲黄色成人网 | 99精品久久 | 最新免费黄色网址 | 一级毛片,一级毛片 | 精品视频在线播放 | 狠狠干美女 |