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

本文介绍了如何利用.NET的CodeDom来实现脚本引擎,详细讲解了构造编译器、编译源代码以及执行代码的过程。CodeDom虽然不如VsaEngine正规,但在一般应用中功能强大,能编译多种CLR语言。然而,由于生成的Assembly无法动态卸载,可能导致内存占用过多。解决此问题的方法是将编译器置于独立的AppDomain中。
摘要由CSDN通过智能技术生成

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

        .NET 本身提供了强大的脚本引擎,可以直接使用.NET CLR的任何编程语言作为脚本语言,如VB.NET、C#、JScript, J#等等。使用脚本引擎,我们可以动态生成任意表达式、或动态导入任意脚本文件,并在任意时候执行。
        经实践发现,我们可以使用至少两种不同的方式在.NET中使用脚本引擎:VsaEngine和CodeDom。
        其实,CodeDom不能算是真正的脚本引擎,它实际上是编译器。但是我们完全可以利用CodeDom来模拟脚本引擎。
        使用Emit方法也能达到动态生成可执行代码的目的,而且Emit生成的代码不需要编译,因此速度更快。但是Emit插入的实际上是汇编代码,不能算是脚本语言。
        本文介绍如何以CodeDom方式来动态生成可执行代码。

如何在.NET中实现脚本引擎 (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:        

vb.net  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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值