// 准备脚本环境 int PrepareScript(string strProjectName, string strProjectLocate, out XmlStatis objStatis, out string strError) { this.AssemblyMain = null; objStatis = null; string strWarning = ""; string strMainCsDllName = PathUtil.MergePath(this.InstanceDir, "\\~xml_statis_main_" + Convert.ToString(AssemblyVersion++) + ".dll"); // ++ string strLibPaths = "\"" + this.MainForm.DataDir + "\"" + "," + "\"" + strProjectLocate + "\""; string[] saAddRef = { // 2011/4/20 增加 "system.dll", "system.drawing.dll", "system.windows.forms.dll", "system.xml.dll", "System.Runtime.Serialization.dll", Environment.CurrentDirectory + "\\digitalplatform.dll", Environment.CurrentDirectory + "\\digitalplatform.Text.dll", Environment.CurrentDirectory + "\\digitalplatform.IO.dll", Environment.CurrentDirectory + "\\digitalplatform.Xml.dll", Environment.CurrentDirectory + "\\dp2circulation.exe", }; // 创建Project中Script main.cs的Assembly // return: // -2 出错,但是已经提示过错误信息了。 // -1 出错 int nRet = ScriptManager.BuildAssembly( "XmlStatisForm", strProjectName, "main.cs", saAddRef, strLibPaths, strMainCsDllName, out strError, out strWarning); if (nRet == -2) { goto ERROR1; } if (nRet == -1) { if (strWarning == "") { goto ERROR1; } MessageBox.Show(this, strWarning); } this.AssemblyMain = Assembly.LoadFrom(strMainCsDllName); if (this.AssemblyMain == null) { strError = "LoadFrom " + strMainCsDllName + " fail"; goto ERROR1; } // 得到Assembly中XmlStatis派生类Type Type entryClassType = ScriptManager.GetDerivedClassType( this.AssemblyMain, "dp2Circulation.XmlStatis"); if (entryClassType == null) { strError = strMainCsDllName + "中没有找到 dp2Circulation.XmlStatis 派生类。"; goto ERROR1; } // new一个XmlStatis派生对象 objStatis = (XmlStatis)entryClassType.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null); // 为XmlStatis派生类设置参数 objStatis.XmlStatisForm = this; objStatis.ProjectDir = strProjectLocate; objStatis.InstanceDir = this.InstanceDir; return(0); ERROR1: return(-1); }
int RunScript(string strProjectName, string strProjectLocate, out string strError) { EnableControls(false); stop.OnStop += new StopEventHandler(this.DoStop); stop.Initial("正在执行脚本 ..."); stop.BeginLoop(); this.Update(); this.MainForm.Update(); _dllPaths.Clear(); _dllPaths.Add(strProjectLocate); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); try { int nRet = 0; strError = ""; this.objStatis = null; this.AssemblyMain = null; // 2009/11/5 // 防止以前残留的打开的文件依然没有关闭 Global.ForceGarbageCollection(); nRet = PrepareScript(strProjectName, strProjectLocate, out objStatis, out strError); if (nRet == -1) { goto ERROR1; } objStatis.ProjectDir = strProjectLocate; objStatis.Console = this.Console; objStatis.InputFilename = this.textBox_inputXmlFilename.Text; // 执行脚本的OnInitial() // 触发Script中OnInitial()代码 // OnInitial()和OnBegin的本质区别, 在于OnInitial()适合检查和设置面板参数 if (objStatis != null) { StatisEventArgs args = new StatisEventArgs(); objStatis.OnInitial(this, args); if (args.Continue == ContinueType.SkipAll) { goto END1; } } // 触发Script中OnBegin()代码 // OnBegin()中仍然有修改MainForm面板的自由 if (objStatis != null) { StatisEventArgs args = new StatisEventArgs(); objStatis.OnBegin(this, args); if (args.Continue == ContinueType.SkipAll) { goto END1; } } // 循环 nRet = DoLoop(out strError); if (nRet == -1) { goto ERROR1; } if (nRet == 1) { goto END1; // TODO: SkipAll如何执行? 是否连OnEnd也不执行了? } END1: // 触发Script的OnEnd()代码 if (objStatis != null) { StatisEventArgs args = new StatisEventArgs(); objStatis.OnEnd(this, args); } return(0); ERROR1: return(-1); } catch (Exception ex) { strError = "脚本执行过程抛出异常: \r\n" + ExceptionUtil.GetDebugText(ex); return(-1); } finally { if (objStatis != null) { objStatis.FreeResources(); } stop.EndLoop(); stop.OnStop -= new StopEventHandler(this.DoStop); stop.Initial(""); this.AssemblyMain = null; EnableControls(true); AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve); } }