public async Task <Tuple <string, string> > GetAssemblyBytesAsync()
        {
            ICompilationService compilationService = CompilationServiceFactory.CreateService(_entityMetaData, GetScriptOptions(_frameworkReferences));

            _compilation = await compilationService.GetCompilationAsync();

            _diagnostics = await _compilation.GetDiagnosticsAsync();

            IsCompilationSuccessful = !_diagnostics.Any(d => d.Severity == DiagnosticSeverity.Error);
            CompilationOutput       = _diagnostics.Select(m => m.ToString());

            if (!IsCompilationSuccessful)
            {
                throw new ScriptCompilationException(CompilationOutput);
            }

            return(await _compilation.GetAssemblyBytesAsync());
        }
        /// <summary>
        /// Initializes the entry point by compiling the script and loading/saving the assembly
        /// </summary>
        /// <returns>Taks for initializing entry point.</returns>
        public async Task InitializeEntryPointAsync()
        {
            var referenceResolver = new MemoryReferenceResolver(_frameworkLoads);
            ICompilationService compilationService = CompilationServiceFactory.CreateService(_entityMetaData, GetScriptOptions(referenceResolver));

            _compilation = await compilationService.GetCompilationAsync();

            _diagnostics = await _compilation.GetDiagnosticsAsync();

            References = referenceResolver.Used.ToImmutableArray();

            IsCompilationSuccessful = !_diagnostics.Any(d => d.Severity == DiagnosticSeverity.Error);
            CompilationOutput       = _diagnostics.Select(m => m.ToString());

            if (IsCompilationSuccessful)
            {
                try
                {
                    memberInfo = await _compilation.GetEntryPoint();

                    InitializeAttributes();
                    Validate();
                }
                catch (Exception ex)
                {
                    if (ex is ScriptCompilationException scriptEx)
                    {
                        IsCompilationSuccessful = false;

                        if (scriptEx.CompilationOutput.Any())
                        {
                            CompilationOutput = CompilationOutput.Concat(scriptEx.CompilationOutput);
                        }

                        return;
                    }

                    throw;
                }
            }
        }
        /// <summary>
        /// Initializes the entry point by compiling the script and loading/saving the assembly
        /// </summary>
        /// <param name="assemblyInitType"></param>
        /// <returns></returns>
        public async Task InitializeEntryPointAsync()
        {
            ICompilationService compilationService = CompilationServiceFactory.CreateService(_entityMetaData, GetScriptOptions(_frameworkReferences));

            _compilation = await compilationService.GetCompilationAsync();

            _diagnostics = await _compilation.GetDiagnosticsAsync();

            IsCompilationSuccessful = !_diagnostics.Any(d => d.Severity == DiagnosticSeverity.Error);
            CompilationOutput       = _diagnostics.Select(m => m.ToString());

            if (IsCompilationSuccessful)
            {
                try
                {
                    EntityMethodSignature methodSignature = _compilation.GetEntryPointSignature();
                    Assembly assembly = await _compilation.EmitAssemblyAsync();

                    _entryPointMethodInfo = methodSignature.GetMethod(assembly);

                    InitializeAttributes();
                    Validate();
                }
                catch (Exception ex)
                {
                    if (ex is ScriptCompilationException scriptEx)
                    {
                        IsCompilationSuccessful = false;

                        if (scriptEx.CompilationOutput.Any())
                        {
                            CompilationOutput = CompilationOutput.Concat(scriptEx.CompilationOutput);
                        }

                        return;
                    }

                    throw ex;
                }
            }
        }
        public async Task <string> SaveAssemblyToDiskAsync(string assemblyPath)
        {
            var referenceResolver = new MemoryReferenceResolver(_frameworkLoads);
            ICompilationService compilationService = CompilationServiceFactory.CreateService(_entityMetaData, GetScriptOptions(referenceResolver));

            _compilation = await compilationService.GetCompilationAsync();

            _diagnostics = await _compilation.GetDiagnosticsAsync();

            References = referenceResolver.Used.ToImmutableArray();

            IsCompilationSuccessful = !_diagnostics.Any(d => d.Severity == DiagnosticSeverity.Error);
            CompilationOutput       = _diagnostics.Select(m => m.ToString());

            if (!IsCompilationSuccessful)
            {
                throw new ScriptCompilationException(CompilationOutput);
            }

            return(await _compilation.SaveAssemblyAsync(assemblyPath));
        }