示例#1
0
        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 };
        }