Esempio n. 1
0
 public ScriptHost(BaseScriptEngine engine)
 {
     Engine      = engine;
     Book        = new Book.SCBook(this);
     Spreadsheet = new Spreadsheet.SCSpreadsheet(this);
     Grid        = new Grid.SCGrid(this);
     Heap        = new Heap.SCHeap(this);
 }
 public new static DashboardDocumentViewModel Create(BaseScriptEngine engine) =>
 ViewModelSource.Create <DashboardDocumentViewModel>(() => new DashboardDocumentViewModel(engine));
 public DashboardDocumentViewModel(BaseScriptEngine engine) : base(engine)
 {
 }
 public new static PivotDocumentViewModel Create(BaseScriptEngine engine) =>
 ViewModelSource.Create <PivotDocumentViewModel>(() => new PivotDocumentViewModel(engine));
 public PivotDocumentViewModel(BaseScriptEngine engine) : base(engine)
 {
 }
        protected override void EndProcessing()
        {
            var externalHost = CheckExternalHost();

            var scriptFile = Project.Current.MapPath(ScriptFile);

            if (!Engine.HasValue && !string.IsNullOrWhiteSpace(scriptFile))
            {
                var ext = Utils.NonNullString(Path.GetExtension(scriptFile)).ToLower().Trim();
                switch (ext)
                {
                case ".ps1":
                case ".psm1":
                case ".psd1":
                case ".ps":
                    Engine = ScriptEngine.PowerShell;
                    break;

                case ".r":
                    Engine = ScriptEngine.R;
                    break;

                case ".python":
                case ".py":
                    Engine = ScriptEngine.Python;
                    break;
                }
            }

            BaseScriptEngine engine = (Engine ?? ScriptEngine.PowerShell) switch
            {
                ScriptEngine.PowerShell => new PowerShellScriptEngine(),
                ScriptEngine.R => new RScriptEngine(),
                ScriptEngine.Python => new PythonScriptEngine(),
                _ => new PowerShellScriptEngine()
            };

            try
            {
                engine.RequestLine += (s, e) => e.Line = null;

                engine.BookServer  = Book?.BookServer ?? externalHost.BookServer;
                engine.Workbook    = Spreadsheet?.Workbook ?? externalHost.Spreadsheet;
                engine.GridDataSet = Data ?? new DataSet("Script");

                engine.ExecutionType     = BaseScriptEngine.ScriptExecutionType.Script;
                engine.SynchronizeInvoke = externalHost.SynchronizeInvoke;

                string script = Script;
                if (string.IsNullOrWhiteSpace(script))
                {
                    ExecuteLocked(() =>
                    {
                        using var reader = File.OpenText(scriptFile);
                        script           = reader.ReadToEnd();
                    }, LockFiles ? LockObject : null);
                }

                var taskSource = new TaskCompletionSource <bool>();

                engine.ExecutionFinished += callback;

                engine.Start();

                if (Parameters != null)
                {
                    if (engine is PowerShellScriptEngine psEngine)
                    {
                        foreach (DictionaryEntry parameter in Parameters)
                        {
                            psEngine.AddVariable(Convert.ToString(parameter.Key), parameter.Value);
                        }
                    }
                    else if (engine is ProcessScriptEngine procEngine)
                    {
                        foreach (DictionaryEntry parameter in Parameters)
                        {
                            procEngine.EnvironmentVariables[Convert.ToString(parameter.Key)] = Convert.ToString(parameter.Value);
                        }
                    }
                    else
                    {
                        throw new Exception("Parameters are not supported for selected script engine.");
                    }
                }

                engine.SendCommand(script);

                taskSource.Task.Wait();     //Cannot await in event handler.


                void callback(object s, EventArgs e)
                {
                    engine.ExecutionFinished -= callback;
                    taskSource.SetResult(true);
                }
            }
            finally
            {
                engine.BookServer = null;   //Do not dispose
                engine.Workbook   = null;   //Do not dispose
                engine.GridDataSet?.Dispose();
                engine.GridDataSet = null;

                engine.Dispose();
            }
        }
    }
 public CustomConsoleDocumentViewModel(BaseScriptEngine engine) : base(engine)
 {
 }