Type CompileCore(IPersistentAssemblyInfo persistentAssemblyInfo, string generateCode, CompilerParameters compilerParams, System.CodeDom.Compiler.CodeDomProvider codeProvider) { CompilerResults compileAssemblyFromSource = null; try { compileAssemblyFromSource = codeProvider.CompileAssemblyFromSource(compilerParams, generateCode); if (compilerParams.GenerateInMemory) { Assembly compiledAssembly = compileAssemblyFromSource.CompiledAssembly; CompiledAssemblies.Add(compiledAssembly); return compiledAssembly.GetTypes().Where(type => typeof(ModuleBase).IsAssignableFrom(type)).Single(); } return null; } catch (Exception e) { Tracing.Tracer.LogError(e); } finally { if (compileAssemblyFromSource != null) { SetErrors(compileAssemblyFromSource, persistentAssemblyInfo,compilerParams); } if (Directory.Exists(STR_StrongKeys)) Directory.Delete(STR_StrongKeys, true); } return null; }
public string CompileWithProvider(string[] sources, System.CodeDom.Compiler.CodeDomProvider cp, params string [] RefAssemblies) { OnChangeCompilerState(this, CompilerState.CompilationStarting, CompilerOptions.SourceFileName); OnChangeCompilerState(this, CompilerState.BeginCompileFile, CompilerOptions.SourceFileName); Reset(); //var cscp = new Microsoft.CSharp.CSharpCodeProvider(); var comp_opt = new CompilerParameters(); comp_opt.IncludeDebugInformation = CompilerOptions.Debug; comp_opt.GenerateExecutable = true; comp_opt.WarningLevel = 3; comp_opt.CompilerOptions = "/platform:x86 "; comp_opt.OutputAssembly = CompilerOptions.OutputFileName; if (RefAssemblies!=null) comp_opt.ReferencedAssemblies.AddRange(RefAssemblies); //string source = GetSourceFileText(CompilerOptions.SourceFileName); var res = cp.CompileAssemblyFromSource(comp_opt, sources); if (res.Errors.Count > 0) { for (int i = 0; i < res.Errors.Count; i++) { if (!res.Errors[i].IsWarning && errorsList.Count == 0 /*&& res.Errors[i].FileName != redirect_fname*/) { if (File.Exists(res.Errors[i].FileName)) errorsList.Add(new Errors.CommonCompilerError(res.Errors[i].ErrorText, res.Errors[i].FileName, res.Errors[i].Line != 0 ? res.Errors[i].Line : 1, res.Errors[i].Column != 0 ? res.Errors[i].Column : 1)); else errorsList.Add(new Errors.CommonCompilerError(res.Errors[i].ErrorText, CompilerOptions.SourceFileName, res.Errors[i].Line != 0 ? res.Errors[i].Line : 1, res.Errors[i].Column != 0 ? res.Errors[i].Column : 1)); } else if (res.Errors[i].IsWarning) { warnings.Add(new Errors.CommonWarning(res.Errors[i].ErrorText, res.Errors[i].FileName, res.Errors[i].Line, res.Errors[i].Column)); } } } //linesCompiled = get_compiled_lines(CompilerOptions.SourceFileName); OnChangeCompilerState(this, CompilerState.CompilationFinished, CompilerOptions.SourceFileName); ClearAll(); OnChangeCompilerState(this, CompilerState.Ready, null); if (errorsList.Count > 0) return null; else return res.PathToAssembly; }
private static Type CreateCodeGeneratorType(System.CodeDom.Compiler.CodeDomProvider compilerProvider, string resourceName, string typeName) { string sourceCode = null; using (Stream sourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(sourceStream)) { sourceCode = reader.ReadToEnd(); } CompilerParameters compilerParams = new CompilerParameters(); compilerParams.CompilerOptions = "/d:PREPROCESSED_TEMPLATE"; compilerParams.GenerateInMemory = true; compilerParams.GenerateExecutable = false; // grab the assemblies by location so that we don't compile against one that we didn't reference compilerParams.ReferencedAssemblies.AddRange(new string[] { typeof(System.CodeDom.Compiler.CodeDomProvider).Assembly.Location, // System.dll typeof(System.Linq.Enumerable).Assembly.Location, // System.Core.dll typeof(System.Data.Objects.ObjectContext).Assembly.Location, // System.Data.Entity.dll typeof(System.Data.Entity.Design.EntityCodeGenerator).Assembly.Location, // System.Data.Entity.Design.dll typeof(System.Data.DbType).Assembly.Location, // System.Data.dll typeof(System.Xml.XmlAttribute).Assembly.Location, // System.Xml.dll typeof(System.Xml.Linq.XElement).Assembly.Location, // System.Xml.Linq.dll }); #if !ENABLE_TEMPLATE_DEBUGGING CompilerResults results = compilerProvider.CompileAssemblyFromSource(compilerParams, sourceCode); #else // enables debugging compilerParams.GenerateInMemory = false; compilerParams.IncludeDebugInformation = true; string baseName = Path.GetFileNameWithoutExtension(Path.GetTempFileName()) + "."; compilerParams.OutputAssembly = Path.Combine(Path.GetTempPath(), baseName + typeName + ".Assembly.dll"); string sourceFileName = Path.Combine(Path.GetTempPath(), baseName + typeName + ".Source." + compilerProvider.FileExtension); File.WriteAllText(sourceFileName, sourceCode); CompilerResults results = compilerProvider.CompileAssemblyFromFile(compilerParams, sourceFileName); #warning DO NOT CHECK IN LIKE THIS, Dynamic Assembly Debugging is enabled #endif if (results.Errors.HasErrors) { string message = results.Errors.OfType<CompilerError>().Aggregate(string.Empty, (accumulated, input) => accumulated == string.Empty ? input.ToString() : accumulated + Environment.NewLine + input.ToString()); throw EDesignUtil.InvalidOperation(message); } return results.CompiledAssembly.GetType(typeName); }