public List<string> AnswerCheck(int id, string source)
        {
            string fileName = @"c:\Test\"+DateTime.Now.Ticks+".dll";

            Task task = new Task(id);

            //Configure compiler
            Dictionary<string, string> CompilerOptions = new Dictionary<string, string>
            {
                {"CompilerVersion", "v3.5" }
            };

            CSharpCodeProvider provider = new CSharpCodeProvider(CompilerOptions);

            CompilerParameters compileParam = new CompilerParameters
            {
                OutputAssembly = fileName,
                GenerateExecutable = false
            };

            CompilerResults result = provider.CompileAssemblyFromSource(compileParam, source);
            provider.Dispose();

            //check result of compile
            if (result.Errors.Count != 0)
            {
                List<string> list = new List<string>();
                foreach (CompilerError err in result.Errors)
                    list.Add(err.ToString());
                return list;
            }

            //Invoke user method
            Assembly assembly = result.CompiledAssembly;
            Type type = assembly.GetType("Task.User");
            if (type == null)
            {
                throw new Exception("Type not found!");
            }
            MethodInfo method = type.GetMethod(task.MethodName);
            if (method != null)
            {
                //Check answer
                int res = (int)method.Invoke(null, null);
                if (res == task.Answer)
                    return new List<string> { "true" };
                else
                    return new List<string> { "false" };
            }
            else
                throw new Exception("method not found!");
        }