Пример #1
0
        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));
        }
Пример #2
0
        /// <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);
                }
            }
        }