/// <summary> /// Create Assembly whick will run /// </summary> /// <param name="script"></param> /// <param name="errorMsg"></param> /// <returns></returns> private Assembly CreateAsmExecutor(string script, out string errorMsg) { errorMsg = null; var assemblyName = _scriptHash; var references = CSharpReferenceManager.GetMetaDataReferences()[_currentAppName]; var compilation = CSharpCompilation.Create(assemblyName, new[] { GetSyntaxTree(script) }, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary).WithOptimizationLevel(FaaSSettingsConfigHelper.IsDebugMode() ? OptimizationLevel.Debug : OptimizationLevel.Release)); Assembly assembly = null; using (var assemblyStream = new MemoryStream()) { using (var pdbStream = new MemoryStream()) { var emitDynamicScriptExecuteResult = compilation.Emit(assemblyStream, pdbStream); if (emitDynamicScriptExecuteResult.Success) { var assemblyBytes = assemblyStream.GetBuffer(); var pdbBytes = pdbStream.GetBuffer(); assembly = Assembly.Load(assemblyBytes, pdbBytes); //output files if (FaaSSettingsConfigHelper.IsOutPutFiles()) { OutputDynamicScriptAllFile(script, assemblyName, assemblyBytes, pdbBytes); } } else { var msgs = new StringBuilder(); foreach (var msg in emitDynamicScriptExecuteResult.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error).Select(d => string.Format("[{0}]:{1}({2})", d.Id, d.GetMessage(), d.Location.GetLineSpan().StartLinePosition))) { msgs.AppendLine(msg); } if (FaaSSettingsConfigHelper.IsOutPutFiles()) { WriteDynamicScriptCs(Path.Combine(EnsureOutputPath(), assemblyName + ".cs"), script); } errorMsg = msgs.ToString(); _logger.LogError(String.Format("{0}:{1}:{2}:{3}:{4}", _tenantId, "CSharp", _currentAppName, errorMsg, _scriptHash)); } } } _logger.LogInformation($"CreateAsmExecutor -> _context:{_tenantId},{"CSharp"}, {_currentAppName},{_scriptHash} _scriptTypeDict:{_scriptTypeDict?.Count} _metadataReferences:{ CSharpReferenceManager.GetMetaDataReferences()[_currentAppName]?.Count}"); return(assembly); }
static CSharpDynamicScriptEngine() { //初始化引用 CSharpReferenceManager.InitMetadataReferences(); }