示例#1
0
        public void Compile(Core.Models.Script item)
        {
            Throw.IfNull(item);

            ScriptOptions scriptOptions = ScriptOptions.Default;

            // Add reference to mscorlib
            var mscorlib   = typeof(object).GetTypeInfo().Assembly;
            var systemCore = typeof(System.Linq.Enumerable).GetTypeInfo().Assembly;
            var dicom      = typeof(Dicom.DicomAgeString).GetTypeInfo().Assembly;

            var assemblies = new[] { mscorlib, systemCore, dicom };

            scriptOptions = scriptOptions.AddReferences(assemblies);

            List <Assembly> referenceAssemblies = new List <Assembly>();

            foreach (var referenceString in item.references)
            {
                referenceAssemblies.Add(Type.GetType(referenceString).Assembly);
            }
            scriptOptions.AddReferences(referenceAssemblies);

            scriptOptions.AddImports(item.imports);

            scriptOptions = scriptOptions.AddReferences(typeof(Enumerable).Assembly).AddImports("System.Linq", "System");
            scriptOptions = scriptOptions.AddReferences(typeof(DicomTag).Assembly).AddImports("Dicom");
            scriptOptions = scriptOptions.AddReferences(typeof(Logger).Assembly).AddImports("LifeImageLite");

            using var interactiveLoader = new InteractiveAssemblyLoader();
            foreach (var reference in referenceAssemblies)
            {
                interactiveLoader.RegisterDependency(reference);
            }

            item.script = CSharpScript.Create <RoutedItem>(item.source, options: scriptOptions, globalsType: typeof(RoutedItem), assemblyLoader: interactiveLoader);

            try
            {
                item.script.Compile();
            }
            catch (CompilationErrorException e)
            {
                item.errors = $"{e.Message} {e.StackTrace}";
                _logger.Log(LogLevel.Warning, $"{e.Message} {e.StackTrace}");
            }
            catch (System.IO.FileLoadException e)
            {
                item.errors = $"{e.Message} {e.StackTrace}";
                _logger.Log(LogLevel.Warning, $"{e.Message} {e.StackTrace}");
            }
        }
示例#2
0
        public async Task <ScriptState> RunAsync(Core.Models.Script item, RoutedItem routedItem)
        {
            Throw.IfNull(item);

            ScriptState scriptState = null;

            try
            {
                if (item.script == null)
                {
                    Compile(item);
                }
                scriptState = await item.script.RunAsync(globals : routedItem);

                item.errors = $"No Errors.  Last executed at {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff")}";
            }
            catch (TaskCanceledException)
            {
                _logger.Log(LogLevel.Information, $"Task was canceled.");
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);

                item.errors = $"{e.Message} {e.StackTrace}";
                int i             = 1;
                int j             = 0;
                var lines         = item.script.Code.Split("\n");
                var formattedCode = "";
                foreach (var line in lines)
                {
                    formattedCode += $"[{i++},{j}] " + line.Replace("\n", "").Trim() + (line == "" ? "" : "\n");
                    j             += line.Length + 1;
                }
                _logger.Log(LogLevel.Critical, $"code: \n{formattedCode}");
            }
            return(scriptState);
        }