internal static async Task<LiveCodeCompilationResult> Compile(IEnumerable<string> sourceFilesPaths, string projectName, IEnumerable<string> references, bool createAssemblyFiles = false) { string[] filesPaths = sourceFilesPaths as string[] ?? sourceFilesPaths.ToArray(); string[] sourceFiles = filesPaths.ToArray(); string location = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string assemblyName = GetNewAssemblyName(projectName, location); // clean up previous assemblies DeletePreviousAssemblies(projectName, location); // setup compilation parameters var options = SetupCompilationParameters(createAssemblyFiles, assemblyName, sourceFiles, location, references); // compile var cSharpCodeProvider = new CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v4.0" } }); CompilerResults results = await cSharpCodeProvider.CompileAsync(options, sourceFiles); cSharpCodeProvider.Dispose(); var errorMessage = new StringBuilder(); if (results.Errors.HasErrors) { errorMessage.Append(string.Format("Compilation errors for {0}", projectName)); foreach (CompilerError error in results.Errors) { errorMessage.Append(string.Format("{0}({1},{2}): {3}", error.FileName, error.Line, error.Column, error.ErrorText)); } return new LiveCodeCompilationResult{ ErrorMessage = errorMessage.ToString() }; } // load compiled assembly if (createAssemblyFiles) { // load from disk return await LoadAssemblyFromDisk(assemblyName); } // load from memory return new LiveCodeCompilationResult { Assembly = results.CompiledAssembly, HasSucceed = true }; }