新聞中心
1、C#代碼解釋器簡(jiǎn)介

成都創(chuàng)新互聯(lián)憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶提供超值的營(yíng)銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營(yíng)銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶提供了成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
能夠動(dòng)態(tài)執(zhí)行 C#代碼是一件很酷的功能,比如,我們可以在控制臺(tái)中輸入一行 C#代碼,然后程序自動(dòng)編譯并執(zhí)行這一行代碼,將結(jié)果顯示給我們。這差不多就是一個(gè)最簡(jiǎn)單的 C#代碼解釋器了。
動(dòng)態(tài)執(zhí)行 C#代碼又是一件很有用的功能,比如,我們可以將某些代碼寫在某個(gè)文件之中,由程序集在執(zhí)行時(shí)進(jìn)行加載,改變這些代碼不用中止程序,當(dāng)程序再次加載這些代碼時(shí),就自動(dòng)執(zhí)行的是新代碼了。
2、簡(jiǎn)單的 C#代碼解釋器
- 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
,Assembly>Assemblys{get;set;} - publicContext()
- {
- CodeProvider=newCSharpCodeProvider(newDictionary
,string>()
{{"CompilerVersion","v3.5"}});- Assemblys=newDictionary
,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("編譯錯(cuò)誤:");
- 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;
- }
- }
- }
分享文章:簡(jiǎn)單的C#代碼解釋器
文章出自:http://www.fisionsoft.com.cn/article/ccsjhgs.html


咨詢
建站咨詢
