如何在.NET中实现脚本引擎(CodeDom篇).docVIP

  • 8
  • 0
  • 约7.38千字
  • 约 5页
  • 2016-02-25 发布于江苏
  • 举报
如何在.NET中实现脚本引擎(CodeDom篇).doc

如何在.NET中实现脚本引擎(CodeDom篇) .NET 本身提供了强大的脚本引擎,可以直接使用.NET CLR的任何编程语言作为脚本语言,如VB.NET、C#、JScript, J#等等。使用脚本引擎,我们可以动态生成任意表达式、或动态导入任意脚本文件,并在任意时候执行。经实践发现,我们可以使用至少两种不同的方式在.NET中使用脚本引擎:VsaEngine和CodeDom。其实,CodeDom不能算是真正的脚本引擎,它实际上是编译器。但是我们完全可以利用CodeDom来模拟脚本引擎。使用Emit方法也能达到动态生成可执行代码的目的,而且Emit生成的代码不需要编译,因此速度更快。但是Emit插入的实际上是汇编代码,不能算是脚本语言。本文介绍如何以CodeDom方式来动态生成可执行代码。1.?构造一个编译器设置编译参数编译参数需要在CompilerParameters设置:CompilerOptions 用于设置编译器命令行参数 IncludeDebugInformation 用于指示是否在内存在生成Assembly GenerateInMemory 用于指示是否在内存在生成Assembly GenerateExecutable 用于指示生成的Assembly类型是exe还是dll OutputAssembly 用于指示生成的程序文件名(仅在GenerateInMemory为false的情况) ReferencedAssemblies 用于添加引用Assembly 例如:theParameters.ReferencedAssemblies.Add(System.dll); 创建指定语言的编译器编译需要由指定语言的CodeDomProvider生成。这里列举一些.NET的CodeDomProvider:? Microsoft.VisualBasic.VBCodeProvider C# Microsoft.CSharp.CSharpCodeProvider jscript Microsoft.JScript.JScriptCodeProvider J# Microsoft.VJSharp.VJSharpCodeProvider 以C#为例,要创建C#编译器,代码如下:CodeDomProvider theProvider=?(ICodeCompiler)?new?Microsoft.CSharp.CSharpCodeProvider(); 下面是完整的创建编译器的例子:?/**////?summary ///?创建相应脚本语言的编译器///?/summary private?void?createCompiler(string?strLanguage,?bool?debugMode,?string?strAssemblyFileName) { ??????this.theParameters?=?new?CompilerParameters(); ??????this.theParameters.OutputAssembly?=?System.IO.Path.Combine(System.IO.Path.GetTempPath(),?strAssemblyFileName?+?.dll); ??????this.theParameters.GenerateExecutable?=?false; ??????this.theParameters.GenerateInMemory?=?true; ??????if(debugMode) ??????{ ???????????this.theParameters.IncludeDebugInformation?=?true; ???????????this.theParameters.CompilerOptions?+=?/define:TRACE=1?/define:DEBUG=1?; ??????} ??????else ??????{ ???????????this.theParameters.IncludeDebugInformation?=?false; ???????????this.theParameters.CompilerOptions?+=?/define:TRACE=1?; ??????} ????????????AddReference(System.dll); ????????????AddReference(System.Data.dll); ????????????AddReference(System.Xml.dll); ????????????strLanguage?=?strLanguage.ToLower(); ???????

文档评论(0)

1亿VIP精品文档

相关文档