public static Assembly EmitAssembly(
     [NotNull] this FlowScheme scheme, [CanBeNull] string assemblyName = null,
     [CanBeNull] CSharpCompilationOptions options = null)
 {
     byte[] rawAssembly = EmitRawAssembly(scheme, assemblyName, options);
     return((Assembly)AssemblyLoadRawBytes.Invoke(null, new object[] { rawAssembly }));
 }
        public static Flow EmitFlow([NotNull] this FlowScheme scheme)
        {
            var assembly = EmitAssembly(scheme);
            var flowType = assembly.GetType(scheme.FlowFullTypeName);

            return((Flow)Activator.CreateInstance(flowType));
        }
        public HashSet <Assembly> Collect(FlowScheme scheme)
        {
            myAssemblies = new HashSet <Assembly>
            {
                typeof(object).GetTypeInfo().Assembly,
                typeof(Enumerable).GetTypeInfo().Assembly,
                typeof(Expression <>).GetTypeInfo().Assembly,
                typeof(Flow).GetTypeInfo().Assembly
            };

            var systemRuntime = (Assembly)AssemblyLoadByName.Invoke(null,
                                                                    new object[] { "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" });

            if (systemRuntime != null)
            {
                myAssemblies.Add(systemRuntime);
            }

            var linqExpressions = (Assembly)AssemblyLoadByName.Invoke(null,
                                                                      new object[] { "System.Linq.Expressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" });

            if (linqExpressions != null)
            {
                myAssemblies.Add(linqExpressions);
            }

            foreach (var node in scheme.Nodes)
            {
                node.Accept(this);
            }

            foreach (var variable in scheme.GlobalVariables)
            {
                myAssemblies.Add(variable.Type.GetTypeInfo().Assembly);
            }

            return(myAssemblies);
        }
        public static byte[] EmitRawAssembly(
            [NotNull] this FlowScheme scheme, [CanBeNull] string assemblyName = null,
            [CanBeNull] CSharpCompilationOptions options = null)
        {
            var flowTreeBuilder = new FlowTreeBuilder(scheme);

            var syntaxTree = flowTreeBuilder.Build();

            var references = new ReferencesCollector().Collect(scheme);

            var metadataReferences = references.Select(r => MetadataReference.CreateFromFile((string)LocationProperty.GetValue(r)));

            var compilation = CSharpCompilation.Create(
                assemblyName ?? GetTempAssemblyName(),
                new[] { syntaxTree },
                metadataReferences,
                options ?? DefaultCompilationOptions);

            using (var ms = new MemoryStream())
            {
                EmitResult result = compilation.Emit(ms);

                if (!result.Success)
                {
                    var failures = result.Diagnostics
                                   .Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error);

                    var errorMessages = failures.Select(diagnostic => $"{diagnostic.Id}: {diagnostic.GetMessage()}");

                    throw new FlowCompilationException(errorMessages.ToArray());
                }

                ms.Seek(0, SeekOrigin.Begin);
                return(ms.ToArray());
            }
        }
Exemple #5
0
 public FlowTreeBuilder([NotNull] FlowScheme scheme)
 {
     myScheme = scheme;
 }