コード例 #1
0
        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()));
        }
コード例 #2
0
        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");
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: kjpou1/Wasm.Samples
        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}");
            }
        }