private Compilation GenerateCompilation(string assemblyName, params string[] files) { var sourceLanguage = new CSharpLanguage(); var syntaxTrees = files.Select(s => sourceLanguage.ParseText(_fileUtil.FileReadAllText(s), SourceCodeKind.Regular)); return(sourceLanguage .CreateLibraryCompilation(assemblyName: assemblyName, enableOptimisations: false) .AddSyntaxTrees(syntaxTrees.ToArray())); }
public TWrapper Compile <TWrapper>(string code, string typeFullName) where TWrapper : CodeDomTypeWrapper { var sourceLanguage = new CSharpLanguage(); SyntaxTree syntaxTree = sourceLanguage.ParseText(code, SourceCodeKind.Regular); var @interface = typeof(TWrapper).GetInterfaces()[0]; var reference = MetadataReference.CreateFromFile(@interface.Assembly.Location); var assemblyName = typeof(List <>).GetTypeInfo().Assembly.Location; var systemCollectionReference = MetadataReference.CreateFromFile(typeof(List <>).GetTypeInfo().Assembly.Location); var systemCollectionReference2 = MetadataReference.CreateFromFile(Assembly.Load("System.Collections, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a").Location); Compilation compilation = sourceLanguage .CreateLibraryCompilation(assemblyName: "InMemoryAssembly", enableOptimisations: false) .AddReferences(new List <MetadataReference>() { reference, systemCollectionReference2 }) .AddSyntaxTrees(syntaxTree); var lst = new List <string>(); var stream = new MemoryStream(); var emitResult = compilation.Emit(stream); if (emitResult.Success) { stream.Seek(0, SeekOrigin.Begin); var assemblyLoadContext = new SimpleUnloadableAssemblyLoadContext(); var assembly = assemblyLoadContext.LoadFromStream(stream); var wrappedType = assembly.GetType(typeFullName); var obj = Activator.CreateInstance(wrappedType); var codeDomWrapper = (TWrapper)Activator.CreateInstance(typeof(TWrapper), new object[] { wrappedType }); return(codeDomWrapper); } return(null); }
private Assembly CreateAssemblyDefinition(string code) { var sourceLanguage = new CSharpLanguage(); var syntaxTree = sourceLanguage.ParseText(code, SourceCodeKind.Regular); var compilation = sourceLanguage .CreateLibraryCompilation(assemblyName: "InMemoryAssembly", enableOptimisations: false) .AddSyntaxTrees(syntaxTree); var stream = new MemoryStream(); var emitResult = compilation.Emit(stream); if (emitResult.Success) { stream.Seek(0, SeekOrigin.Begin); return(Assembly.Load(stream.ToArray())); } throw new InvalidOperationException("Unable to create dynamic assembly"); }
public static async Task Main(string[] args) { Console.WriteLine("Rolsyn test"); var sf = SyntaxFactory.ParseCompilationUnit("public class Program { public static void Main(){ System.Console.WriteLine(\"Inner hello!\"); } }"); Console.WriteLine($"Parsed SyntaxNode: {sf}"); try { var sourceLanguage = new CSharpLanguage(); Compilation compilation = sourceLanguage .CreateLibraryCompilation(assemblyName: "InMemoryAssembly", enableOptimisations: false) .AddSyntaxTrees(new[] { sf.SyntaxTree }); Console.WriteLine($"Got compilation {File.ReadAllBytes(CorlibReference.Display)?.Length}"); Console.WriteLine($"Symbol:{ compilation.GetTypeByMetadataName("System.Console")}"); // GetDiagnostics seems to keep running in a CPU Bound loop Console.WriteLine($"Got compilation Diagnostics: {compilation.GetDiagnostics().Length}"); Console.WriteLine($"Got compilation DeclarationDiagnostics: {compilation.GetDeclarationDiagnostics().Length}"); Console.WriteLine($"Emitting assembly..."); var stream = new MemoryStream(); var emitResult = compilation.Emit(stream); if (emitResult.Success) { Console.WriteLine($"Got binary assembly: {emitResult.Success}"); var asm = Assembly.Load(stream.ToArray()); if (asm.GetExportedTypes().Where(et => et.Name == "Program").FirstOrDefault() is Type programType) { Console.WriteLine("Got Program type"); if (programType.GetMethod("Main") is MethodInfo mainMethod) { Console.WriteLine("Got Main method"); mainMethod.Invoke(null, null); } } } else { Console.WriteLine($"Failed to emit assembly:"); foreach (var diagnostic in emitResult.Diagnostics) { Console.WriteLine(diagnostic); } } } catch (ReflectionTypeLoadException e) { Console.WriteLine($"TypeLoaderException: {string.Join("\n", e.LoaderExceptions.Select(i => i.ToString()))}"); } catch (Exception e) { Console.WriteLine($"Failed to load project: {e}"); } }