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);
            }
        }
示例#2
0
        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("");
        }