在這段代碼中,首先程序設置編譯器的參數,並為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