程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第十四講 基於動態編譯的VB.NET腳本引擎(上)(8)

C#發現之旅第十四講 基於動態編譯的VB.NET腳本引擎(上)(8)

編輯:關於C語言

在初始化腳本引擎時程序會 在VBCompilerImports列表中添加默認的名稱空間Microsoft.VisualBasic。

准備和執 行編譯的腳本代碼和一些參數後,腳本引擎就來編譯腳本代碼生成臨時程序集了,筆者使用 以下的代碼來進行編譯操作

// 檢查程序集緩存區
myAssembly =  (System.Reflection.Assembly)myAssemblIEs[strRuntimeSource];
if (myAssembly  == null)
{
    // 設置編譯參數
     this.myCompilerParameters.GenerateExecutable = false;
     this.myCompilerParameters.GenerateInMemory = true;
     this.myCompilerParameters.IncludeDebugInformation = true;
    if  (this.myVBCompilerImports.Count > 0)
    {
        //  添加 imports 指令
        System.Text.StringBuilder opt = new  System.Text.StringBuilder();
        foreach (string import in  this.myVBCompilerImports)
        {
             if (opt.Length > 0)
            {
                 opt.Append(",");
            }
             opt.Append(import.Trim());
        }
         opt.Insert(0, " /imports:");
        for (int iCount = 0;  iCount < this.myVBCompilerImports.Count; iCount++)
         {
            this.myCompilerParameters.CompilerOptions =  opt.ToString();
        }
    }//if

    if  (this.bolOutputDebug)
    {
        // 輸出調試信息
        System.Diagnostics.Debug.WriteLine(" Compile VBA.Net script  "r"n" + strRuntimeSource);
        foreach (string dll in  this.myCompilerParameters.ReferencedAssemblIEs)
        {
             System.Diagnostics.Debug.WriteLine("Reference:" + dll);
        }
    }

    // 對VB.Net代碼進行編譯
    Microsoft.VisualBasic.VBCodeProvider provider = new  Microsoft.VisualBasic.VBCodeProvider();
#if DOTNET11
    // 這段 代碼用於微軟.Net1.1
    ICodeCompiler compiler =  provider.CreateCompiler();
    CompilerResults result =  compiler.CompileAssemblyFromSource(
         this.myCompilerParameters,
        strRuntimeSource );
#else
    // 這段代碼用於微軟.Net2.0或更高版本
     CompilerResults result = provider.CompileAssemblyFromSource(
         this.myCompilerParameters,
        strRuntimeSource);
#endif
    // 獲得編譯器控制台輸出文本
     System.Text.StringBuilder myOutput = new System.Text.StringBuilder();
     foreach (string line in result.Output)
    {
         myOutput.Append(""r"n" + line);
    }
     this.strCompilerOutput = myOutput.ToString();
    if  (this.bolOutputDebug)
    {
        // 輸出編譯結果
        if (this.strCompilerOutput.Length > 0)
         {
            System.Diagnostics.Debug.WriteLine("VBAScript  Compile result" + strCompilerOutput);
        }
    }

    provider.Dispose();

    if  (result.Errors.HasErrors == false)
    {
        // 若沒 有發生編譯錯誤則獲得編譯所得的程序集
        this.myAssembly =  result.CompiledAssembly;
    }
    if (myAssembly != null)
    {
        // 將程序集緩存到程序集緩存區中
         myAssemblIEs[strRuntimeSource] = myAssembly;
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved