AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

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

51自学网 2015-08-30 http://www.51zixue.net

  .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
jscriptMicrosoft.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);
}

 

<

 

 

 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,51zixue.net不保证资料的完整性。
上一篇:VC6.0下配置boost库使用正则表达式  下一篇:WinCE&nbsp;应用程序开机自动运行的又一种方法