| 网站首页 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛 |
 
 
 
您现在的位置: 编程中国 >> 技术教程 >> 开发语言 >> VC++ >> VC技术资料 >> 正文
  ►  如何在.NET中实现脚本引擎 (CodeDom篇)
如何在.NET中实现脚本引擎 (CodeDom篇)
作者:沐枫    阅读人次:……    文章来源:沐枫Blog    发布时间:2007-9-5    网友评论()条
 

  .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:        

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>
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();

    if("visualbasic" == strLanguage || "vb" == strLanguage)
    {
        theProvider = new Microsoft.VisualBasic.VBCodeProvider();
        if(debugMode)
            theParameters.CompilerOptions += "/debug:full /optimize- /optionexplicit+ /optionstrict+ /optioncompare:text

/imports:Microsoft.VisualBasic,System,System.Collections,System.Diagnostics ";
        else
            theParameters.CompilerOptions += "/optimize /optionexplicit+ /optionstrict+

            /optioncompare:text /imports:Microsoft.VisualBasic,System,

System.Collections,System.Diagnostics ";
        AddReference("Microsoft.VisualBasic.dll");
    }
    else if("jscript" == strLanguage || "js" == strLanguage)
    {
        theProvider = new Microsoft.JScript.JScriptCodeProvider();
        AddReference("Microsoft.JScript.dll");
    }
    else if("csharp" == strLanguage || "cs" == strLanguage || "c#" == strLanguage)
    {
        theProvider = new Microsoft.CSharp.CSharpCodeProvider();
        if(!debugMode)
            theParameters.CompilerOptions += "/optimize ";
    }
//            else if("jsharp" == strLanguage || "vj" == strLanguage || "j#" == strLanguage)
//            {
//                theProvider = new Microsoft.VJSharp.VJSharpCodeProvider();
//                if(!debugMode)
//                    theParameters.CompilerOptions += "/optimize ";
//            }
    else
        throw new System.Exception("指定的脚本语言不被支持。");
}

/**//// <summary>
/// 添加引用对象。
/// </summary>
/// <param name="__strAssemblyName">引用的文件名</param>
public void AddReference(string __strAssemblyName)
{
    theParameters.ReferencedAssemblies.Add(__strAssemblyName);
}

 

[1] [2] 下一页

 

 
文章录入:编辑01    责任编辑:编辑01 
  • 上一篇文章:

  • 下一篇文章:

  •  
    相关文章
    原创地带
    24小时热门帖子