Example #1
0
        // 准备脚本环境
        int PrepareScript(string strProjectName,
            string strProjectLocate,
            // out Assembly assemblyMain,
            out OperLogStatis objStatis,
            out string strError)
        {
            this.AssemblyMain = null;

            objStatis = null;

            string strWarning = "";
            string strMainCsDllName = PathUtil.MergePath(this.InstanceDir, "\\~operlog_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.marcdom.dll",
									//Environment.CurrentDirectory + "\\digitalplatform.marckernel.dll",
									//Environment.CurrentDirectory + "\\digitalplatform.rms.Client.dll",
									//Environment.CurrentDirectory + "\\digitalplatform.library.dll",
									// Environment.CurrentDirectory + "\\digitalplatform.statis.dll",
									Environment.CurrentDirectory + "\\digitalplatform.dll",
									Environment.CurrentDirectory + "\\digitalplatform.Text.dll",
									Environment.CurrentDirectory + "\\digitalplatform.IO.dll",
									Environment.CurrentDirectory + "\\digitalplatform.Xml.dll",
   									Environment.CurrentDirectory + "\\digitalplatform.circulationclient.dll",
									Environment.CurrentDirectory + "\\digitalplatform.Script.dll",  // 2011/8/25 新增
									// Environment.CurrentDirectory + "\\digitalplatform.dp2.statis.dll",
									// Environment.CurrentDirectory + "\\Interop.SHDocVw.dll",
									Environment.CurrentDirectory + "\\dp2circulation.exe",
            };


            // 创建Project中Script main.cs的Assembly
            // return:
            //		-2	出错,但是已经提示过错误信息了。
            //		-1	出错
            int nRet = ScriptManager.BuildAssembly(
                "OperLogStatisForm",
                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中Statis派生类Type
            Type entryClassType = ScriptManager.GetDerivedClassType(
                this.AssemblyMain,
                "dp2Circulation.OperLogStatis");

            if (entryClassType == null)
            {
                strError = strMainCsDllName + "中没有找到 dp2Circulation.OperLogStatis 派生类。";
                goto ERROR1;
            }

            // new一个Statis派生对象
            objStatis = (OperLogStatis)entryClassType.InvokeMember(null,
                BindingFlags.DeclaredOnly |
                BindingFlags.Public | BindingFlags.NonPublic |
                BindingFlags.Instance | BindingFlags.CreateInstance, null, null,
                null);

            /*
            this.AssemblyMain = Assembly.LoadFrom(strMainCsDllName);
            if (this.AssemblyMain == null)
            {
                strError = "LoadFrom " + strMainCsDllName + " fail";
                goto ERROR1;
            }

            // 得到Assembly中Statis派生类Type
            Type entryClassType = ScriptManager.GetDerivedClassType(
                this.AssemblyMain,
                "dp2Circulation.OperLogStatis");


            objStatis = (Statis)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(this.AssemblyMain.FullName,
                entryClassType.FullName);

            // assemblyMain = null;

            this.m_strMainCsDllName = strMainCsDllName;
             * */



            // 为Statis派生类设置参数
            objStatis.OperLogStatisForm = this;
            objStatis.ProjectDir = strProjectLocate;
            objStatis.InstanceDir = this.InstanceDir;

            return 0;
        ERROR1:
            return -1;
        }
Example #2
0
        // 准备脚本环境
        int PrepareScript(string strProjectName,
                          string strProjectLocate,
                          // out Assembly assemblyMain,
                          out OperLogStatis objStatis,
                          out string strError)
        {
            this.AssemblyMain = null;

            objStatis = null;

            string strWarning       = "";
            string strMainCsDllName = PathUtil.MergePath(this.InstanceDir, "\\~operlog_statis_main_" + Convert.ToString(AssemblyVersion++) + ".dll");    // ++

            string strLibPaths = "\"" + Program.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.marcdom.dll",
                //Environment.CurrentDirectory + "\\digitalplatform.marckernel.dll",
                //Environment.CurrentDirectory + "\\digitalplatform.rms.Client.dll",
                //Environment.CurrentDirectory + "\\digitalplatform.library.dll",
                // Environment.CurrentDirectory + "\\digitalplatform.statis.dll",
                Environment.CurrentDirectory + "\\digitalplatform.dll",
                Environment.CurrentDirectory + "\\digitalplatform.Text.dll",
                Environment.CurrentDirectory + "\\digitalplatform.IO.dll",
                Environment.CurrentDirectory + "\\digitalplatform.Xml.dll",
                Environment.CurrentDirectory + "\\digitalplatform.circulationclient.dll",
                Environment.CurrentDirectory + "\\digitalplatform.libraryclient.dll",

                Environment.CurrentDirectory + "\\digitalplatform.Script.dll",                      // 2011/8/25 新增
                // Environment.CurrentDirectory + "\\digitalplatform.dp2.statis.dll",
                // Environment.CurrentDirectory + "\\Interop.SHDocVw.dll",
                Environment.CurrentDirectory + "\\dp2circulation.exe",
            };


            // 创建Project中Script main.cs的Assembly
            // return:
            //		-2	出错,但是已经提示过错误信息了。
            //		-1	出错
            int nRet = ScriptManager.BuildAssembly(
                "OperLogStatisForm",
                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中Statis派生类Type
            Type entryClassType = ScriptManager.GetDerivedClassType(
                this.AssemblyMain,
                "dp2Circulation.OperLogStatis");

            if (entryClassType == null)
            {
                strError = strMainCsDllName + "中没有找到 dp2Circulation.OperLogStatis 派生类。";
                goto ERROR1;
            }

            // new一个Statis派生对象
            objStatis = (OperLogStatis)entryClassType.InvokeMember(null,
                                                                   BindingFlags.DeclaredOnly |
                                                                   BindingFlags.Public | BindingFlags.NonPublic |
                                                                   BindingFlags.Instance | BindingFlags.CreateInstance, null, null,
                                                                   null);

            /*
             * this.AssemblyMain = Assembly.LoadFrom(strMainCsDllName);
             * if (this.AssemblyMain == null)
             * {
             *  strError = "LoadFrom " + strMainCsDllName + " fail";
             *  goto ERROR1;
             * }
             *
             * // 得到Assembly中Statis派生类Type
             * Type entryClassType = ScriptManager.GetDerivedClassType(
             *  this.AssemblyMain,
             *  "dp2Circulation.OperLogStatis");
             *
             *
             * objStatis = (Statis)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(this.AssemblyMain.FullName,
             *  entryClassType.FullName);
             *
             * // assemblyMain = null;
             *
             * this.m_strMainCsDllName = strMainCsDllName;
             * */



            // 为Statis派生类设置参数
            objStatis.OperLogStatisForm = this;
            objStatis.ProjectDir        = strProjectLocate;
            objStatis.InstanceDir       = this.InstanceDir;

            return(0);

ERROR1:
            return(-1);
        }
Example #3
0
        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 = "";

                // Assembly assemblyMain = null;

                this.objStatis = null;
                this.AssemblyMain = null;

                // 2009/11/5 changed
                // 防止以前残留的打开的文件依然没有关闭
                Global.ForceGarbageCollection();

                /*
                AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve);
                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
                */

                nRet = PrepareScript(strProjectName,
                    strProjectLocate,
                    // out assemblyMain,
                    out objStatis,
                    out strError);
                if (nRet == -1)
                    goto ERROR1;

                /*
                 * 
                 * 
                string strDllName = "";
                nRet = PrepareScript(strProjectName,
                    strProjectLocate,
                    out strDllName,
                    out strError);
                if (nRet == -1)
                    goto ERROR1;

                System.AppDomain NewAppDomain = System.AppDomain.CreateDomain("NewApplicationDomain");

                ObjectHandle h = NewAppDomain.CreateInstanceFrom(strDllName,
                    "scriptcode.MyStatis");
                objStatis = (Statis)h.Unwrap();

                m_strMainCsDllName = strDllName;

                // 为Statis派生类设置参数
                objStatis.OperLogStatisForm = this;
                objStatis.ProjectDir = strProjectLocate;
                 * */

                // this.AssemblyMain = assemblyMain;

                objStatis.ProjectDir = strProjectLocate;
                objStatis.Console = this.Console;
                objStatis.StartDate = this.dateControl_start.Value;
                objStatis.EndDate = this.dateControl_end.Value;

                // 执行脚本的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(DoRecord, 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("");
                stop.HideProgress();

                this.AssemblyMain = null;

                EnableControls(true);
                AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            }
        }
Example #4
0
        public override int RunScript(string strProjectName,
                                      string strProjectLocate,
                                      string strInitialParamString,
                                      out string strError,
                                      out string strWarning)
        {
            strWarning = "";

            EnableControls(false);

            stop.OnStop += new StopEventHandler(this.DoStop);
            stop.Initial("正在执行脚本 ...");
            stop.BeginLoop();

            this.Update();
            Program.MainForm.Update();

            _dllPaths.Clear();
            _dllPaths.Add(strProjectLocate);
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

            try
            {
                int nRet = 0;
                strError = "";

                // Assembly assemblyMain = null;

                this.objStatis    = null;
                this.AssemblyMain = null;

                // 2009/11/5 changed
                // 防止以前残留的打开的文件依然没有关闭
                Global.ForceGarbageCollection();

                /*
                 * AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve);
                 * AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
                 */

                nRet = PrepareScript(strProjectName,
                                     strProjectLocate,
                                     // out assemblyMain,
                                     out objStatis,
                                     out strError);
                if (nRet == -1)
                {
                    goto ERROR1;
                }

                if (strInitialParamString == "test_compile")
                {
                    return(0);
                }


                /*
                 *
                 *
                 * string strDllName = "";
                 * nRet = PrepareScript(strProjectName,
                 *  strProjectLocate,
                 *  out strDllName,
                 *  out strError);
                 * if (nRet == -1)
                 *  goto ERROR1;
                 *
                 * System.AppDomain NewAppDomain = System.AppDomain.CreateDomain("NewApplicationDomain");
                 *
                 * ObjectHandle h = NewAppDomain.CreateInstanceFrom(strDllName,
                 *  "scriptcode.MyStatis");
                 * objStatis = (Statis)h.Unwrap();
                 *
                 * m_strMainCsDllName = strDllName;
                 *
                 * // 为Statis派生类设置参数
                 * objStatis.OperLogStatisForm = this;
                 * objStatis.ProjectDir = strProjectLocate;
                 * */

                // this.AssemblyMain = assemblyMain;

                objStatis.ProjectDir = strProjectLocate;
                objStatis.Console    = this.Console;
                objStatis.StartDate  = this.dateControl_start.Value;
                objStatis.EndDate    = this.dateControl_end.Value;

                // 执行脚本的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(DoRecord, 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("");
                stop.HideProgress();

                this.AssemblyMain = null;

                EnableControls(true);
                AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            }
        }