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

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

編輯:關於C語言

在這段代碼中,首先程序設置編譯器的參數,並為VB編譯器添加引用的程序 集信息,VB.Net編譯器有個名為imports的命令行參數用於指定全局名稱空間。用法為 “/imports:名稱空間1,名稱空間2”,在編譯器命令行中使用imports參數和在代 碼文本中使用imports語句是有所不同的。

然後程序創建一個VBCodeProvider對象開 始編譯腳本,對於微軟.NET框架1.1和2.0其操作過程是有區別的。對微軟.NET1.1還得調用 provider的CreateCompilter函數創建一個IcodeCompiler對象,然後調用它的 CompileAssemblyFromSource來編譯腳本,而對於微軟.Net框架2.0則是直接調用provider的 CompileAssemblyFromSource來編譯腳本的。

編譯器編譯後返回一個CompilerResults 的對象表示編譯結果,若發生編譯錯誤程序就輸出編譯錯誤信息。若編譯成功則程序使用編 譯結果的CompileAssembly屬性獲得編輯腳本代碼生成的臨時程序集對象了。然後把程序集對 象緩存到myAssemblIEs列表中。

分析臨時程序集

調用編譯器編譯腳本代碼後 成功的生成臨時程序集後,腳本引擎需要分析這個程序集,獲得所有的可用的腳本方法,其 分析代碼為

if (this.myAssembly != null)
{
    // 檢 索腳本中定義的類型
    Type ModuleType = myAssembly.GetType(nsName +  "." + ModuleName);
    if (ModuleType != null)
    {
        System.Reflection.MethodInfo[] ms = ModuleType.GetMethods (
            System.Reflection.BindingFlags.Public
             | System.Reflection.BindingFlags.NonPublic
             | System.Reflection.BindingFlags.Static);
        foreach  (System.Reflection.MethodInfo m in ms)
        {
             // 遍歷類型中所有的靜態方法
            // 對 每個方法創建一個腳本方法信息對象並添加到腳本方法列表中。
             ScriptMethodInfo info = new ScriptMethodInfo();
             info.MethodName = m.Name;
            info.MethodObject  = m;
            info.ModuleName = ModuleType.Name;
             info.ReturnType = m.ReturnType;
             this.myScriptMethods.Add(info);
            if  (this.bolOutputDebug)
            {
                 // 輸出調試信息
                 System.Diagnostics.Debug.WriteLine("Get vbs method """ + m.Name +  """");
            }
        }//foreach
         bolResult = true;
    }//if
}//if

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