public static void SucceedRecoder(CSharpCompilation compilation) { if (NSucceedLog.Enabled) { NSucceedLog log = new NSucceedLog(); log.Handler(compilation); log.Write(); } }
/// <summary> /// 获取编译后的程序集 /// </summary> /// <returns></returns> public Assembly GetAssembly() { if (!CheckSyntax()) { return(null); } if (AssemblyName == default) { AssemblyName = Guid.NewGuid().ToString("N"); } var result = StreamCompiler(); Assembly assembly = result.Assembly; if (result.Compilation != null) { if (assembly == default || assembly == null) { bool CS0104SHUT = false; bool CS0234SHUT = false; bool CSO246SHUT = false; var tempCache = SyntaxInfos.TreeCodeMapping; SyntaxOption option = new SyntaxOption(); foreach (var item in result.Errors) { if (item.Id == "CS0104") { WriteWarningLog(item); CS0104SHUT = true; var tempTree = item.Location.SourceTree; var tempCode = tempCache[tempTree]; var(str1, str2) = CS0104Helper.Handler(item.Descriptor.MessageFormat.ToString(), item.GetMessage()); var sets = SyntaxInfos.TreeUsingMapping[tempTree]; if (sets.Contains(str1)) { if (sets.Contains(str2)) { if (str2 == "System") { tempCache[tempTree] = tempCode.Replace($"using {str2};", ""); } else { tempCache[tempTree] = tempCode.Replace($"using {str1};", ""); } } else { tempCache[tempTree] = tempCode.Replace($"using {str2};", ""); } } else { tempCache[tempTree] = tempCode.Replace($"using {str1};", ""); } } else if (item.Id == "CS0234") { WriteWarningLog(item); CS0234SHUT = true; var tempResult = CS0234Helper.Handler(item.Descriptor.MessageFormat.ToString(), item.GetMessage()); GlobalUsing.Remove(tempResult); var tempTree = item.Location.SourceTree; var tempCode = tempCache[tempTree]; tempCache[tempTree] = Regex.Replace(tempCode, $"using {tempResult}(.*?);", ""); } else if (item.Id == "CS0246") { WriteWarningLog(item); CSO246SHUT = true; var tempTree = item.Location.SourceTree; var tempCode = tempCache[tempTree]; var formart = item.Descriptor.MessageFormat.ToString(); CS0246Helper.Handler(item.Descriptor.MessageFormat.ToString(), item.GetMessage()); foreach (var @using in CS0246Helper.GetUsings(formart, tempCode)) { GlobalUsing.Remove(@using); tempCache[tempTree] = tempCode.Replace($"using {@using};", ""); } } } if (CS0104SHUT || CS0234SHUT || CSO246SHUT) { ErrorRetryCount += 1; if (ErrorRetryCount < 2) { foreach (var item in tempCache) { option.Add(tempCache[item.Key], SyntaxInfos.TreeUsingMapping[item.Key]); } SyntaxInfos = option; return(GetAssembly()); } } CompileException.Diagnostics.AddRange(result.Errors); CompileException.ErrorFlag = CompileError.Compile; CompileException.Message = "发生错误,无法生成程序集!"; NErrorLog logError = null; if (UseDetailLog) { logError = new NErrorLog(); logError.Handler(result.Compilation, CompileException.Diagnostics); CompileException.Log = logError.Buffer.ToString(); } if (NErrorLog.Enabled) { if (logError == default) { logError = new NErrorLog(); logError.Handler(result.Compilation, CompileException.Diagnostics); } logError.Write(); } if (ErrorActionType == CompilerResultError.ThrowException) { throw new Exception(CompileException.Log); } } else { CompileException.ErrorFlag = CompileError.None; NSucceedLog logSucceed = null; if (UseDetailLog) { logSucceed = new NSucceedLog(); logSucceed.Handler(result.Compilation); CompileException.Log = logSucceed.Buffer.ToString(); } if (NSucceedLog.Enabled) { if (logSucceed == default) { logSucceed = new NSucceedLog(); logSucceed.Handler(result.Compilation); } logSucceed.Write(); } } } return(assembly); }