在初始化腳本引擎時程序會 在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;
}
}