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()); } }
public FlowTreeBuilder([NotNull] FlowScheme scheme) { myScheme = scheme; }