public Assembly Compile(string assemblyName, PreprocessResult preprocessResult) { var references = new List <MetadataReference>(); // project references references.AddRange(_resolver.ResolveMetadataReference()); // assembly instruction references.AddRange(preprocessResult.References.Select(ResolveAssemblyReference) .Where(metadata => metadata != null)); var compilation = CSharpCompilation.Create( assemblyName, new[] { SyntaxFactory.ParseSyntaxTree(preprocessResult.PreprocessedContent) }, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); using (var stream = new MemoryStream()) { var result = compilation.Emit(stream); _host.LogErrors(result); var transformationAssembly = Assembly.Load(stream.ToArray()); //var transformationAssembly = (Assembly)typeof(Assembly).GetTypeInfo().GetDeclaredMethods("Load").First(m => //{ // var parameters = m.GetParameters(); // return parameters.Length == 1 && parameters[0].ParameterType == typeof(byte[]); //}).Invoke(null, new[] { stream.ToArray() }); return(transformationAssembly); } }
public string ProcessCSXTemplate(string content, string filePath, IMetadataResolveable resolver, ProjectMetadata projmeta) { var references = new List <MetadataReference>(); // project references references.AddRange(resolver.ResolveMetadataReference()); // assembly instruction output = projmeta.OutputPath; var opt = ScriptOptions.Default .WithReferences(_host.StandardAssemblyReferences) .WithMetadataResolver(ScriptMetadataResolver.Default.WithSearchPaths(RuntimeEnvironment.GetRuntimeDirectory())) // .AddImports(_host.StandardImports) //no standard imports .WithFilePath(filePath); var refFiltd = references.Where((item, index) => !_host.StandardAssemblyReferences.Any( x => item.Display.Contains(x + ".dll")) //dont load dlls that re already included in standard ).ToList(); // foreach (var item in rr) // { Console.WriteLine("ref:" + item.Display); } // opt = opt.WithReferences(rr).AddImports(_host.StandardImports); //system object not defined foreach (var dep in refFiltd) { // Logger.Debug("Adding reference to a runtime dependency => " + runtimeDependency); opt = opt.AddReferences(MetadataReference.CreateFromFile(dep.Display)); } var loader = new InteractiveAssemblyLoader(); try { CSharpScript.EvaluateAsync(content, options: opt, loader) .ContinueWith(s => s.Result).Wait(); } catch (CompilationErrorException ex) { if (ex.Message.Contains(")")) { var m = ex.Message.Split(")"); ttConsole.WriteError(m[0] + ")"); ttConsole.WriteError(m[1]); } else { ttConsole.WriteError(ex.Message); } ttConsole.WriteNormal(""); ttConsole.WriteError(ex.StackTrace); } return(""); }