public async Task <ActionResult <int> > SubmitSolution([FromBody] FinalCode codeSubmission) { var task = context.ProgrammingTasks.Find(codeSubmission.TaskId); var result = await codeRunner.GetScore(codeSubmission.Code, task); var newSubmission = new Submission { Code = codeSubmission.Code, UserName = codeSubmission.Name, Score = result, ProgrammingTask = task }; context.Submissions.Add(newSubmission); context.SaveChanges(); return(Ok(result)); }
/// <summary>编译</summary> public void Compile() { if (Method != null) { return; } lock (Parameters) { if (Method != null) { return; } if (FinalCode == null) { GenerateCode(); } var rs = Compile(FinalCode, null); if (rs.Errors == null || !rs.Errors.HasErrors) { // 加载外部程序集 foreach (var item in ReferencedAssemblies) { try { //Assembly.LoadFrom(item); // 先加载到内存,再加载程序集,避免文件被锁定 Assembly.Load(File.ReadAllBytes(item)); WriteLog("加载外部程序集:{0}", item); } catch { } } try { Type = rs.CompiledAssembly.GetTypes()[0]; var name = IsExpression ? "Eval" : "Main"; Method = Type.GetMethod(name, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); } catch (ReflectionTypeLoadException ex) { if (ex.LoaderExceptions != null && ex.LoaderExceptions.Length > 0) { throw ex.LoaderExceptions[0]; } else { throw; } } } else { var err = rs.Errors[0]; // 异常中输出错误代码行 var code = ""; if (!err.FileName.IsNullOrEmpty() && File.Exists(err.FileName)) { code = File.ReadAllLines(err.FileName)[err.Line - 1]; } else { var ss = FinalCode.Split(new[] { Environment.NewLine }, StringSplitOptions.None); if (err.Line > 0 && err.Line <= ss.Length) { code = ss[err.Line - 1].Trim(); } } throw new XException("{0} {1} {2}({3},{4}) {5}", err.ErrorNumber, err.ErrorText, err.FileName, err.Line, err.Column, code); } } }