コード例 #1
0
ファイル: CodeGeneratorTests.cs プロジェクト: exyi/coberec
        void CheckItCompiles(string code, string extension = "")
        {
            var assemblyName = System.IO.Path.GetRandomFileName();
            var references   = new MetadataReference[]
            {
                MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(ImmutableArray).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(ValueTuple <int, int>).Assembly.Location),
                MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("netstandard")).Location),
                MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Runtime")).Location),
            };

            references = references.Concat(ExprCS.MetadataContext.GetReferencedPaths().Select(p => MetadataReference.CreateFromFile(p))).ToArray();

            CSharpParseOptions options = new CSharpParseOptions(LanguageVersion.Latest);
            var compilation            = CSharpCompilation.Create(
                assemblyName,
                syntaxTrees: new[] {
                CSharpSyntaxTree.ParseText(code, options),
                CSharpSyntaxTree.ParseText(ImplicitlyIncludedCode, options),
                CSharpSyntaxTree.ParseText(extension, options)
            },
                references: references,
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            var ms     = new System.IO.MemoryStream();
            var result = compilation.Emit(ms);

            // var errors = CSharpScript.Create<int>(code, options: ScriptOptions.Default., assemblyLoader: new InteractiveAssemblyLoader()).Compile();
            Assert.True(result.Success, $"Compilation of generated code failed:\n" + string.Join("\n", result.Diagnostics) + "\n\n" + code);
        }
コード例 #2
0
        private static IEnumerable <MetadataReference> GetAssemblyReferences()
        {
            var references = new MetadataReference[]
            {
                MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location),
                MetadataReference.CreateFromFile(Path.Combine(typeof(object).GetTypeInfo().Assembly.Location, "..", "mscorlib.dll")),
                MetadataReference.CreateFromFile(Path.Combine(typeof(object).GetTypeInfo().Assembly.Location, "..", "System.Runtime.dll")),
                MetadataReference.CreateFromFile(Path.Combine(typeof(object).GetTypeInfo().Assembly.Location, "..", "System.Collections.dll")),
                MetadataReference.CreateFromFile(Path.Combine(typeof(object).GetTypeInfo().Assembly.Location, "..", "System.Xml.ReaderWriter.dll")),
                MetadataReference.CreateFromFile(Path.Combine(typeof(object).GetTypeInfo().Assembly.Location, "..", "System.Xml.dll")),
                MetadataReference.CreateFromFile(Path.Combine(typeof(object).GetTypeInfo().Assembly.Location, "..", "System.Text.RegularExpressions.dll")),
                MetadataReference.CreateFromFile(typeof(Enumerable).GetTypeInfo().Assembly.Location),
                MetadataReference.CreateFromFile(typeof(XElement).GetTypeInfo().Assembly.Location),
                MetadataReference.CreateFromFile(typeof(System.CodeDom.Compiler.GeneratedCodeAttribute).GetTypeInfo().Assembly.Location)
            };

            if (File.Exists(Path.Combine(typeof(object).GetTypeInfo().Assembly.Location, "..", "System.Private.Xml.dll")))
            {
                references = references
                             .Concat(new[] { MetadataReference.CreateFromFile(Path.Combine(typeof(object).GetTypeInfo().Assembly.Location, "..", "System.Private.Xml.dll")) })
                             .ToArray();
            }

            return(references);
        }
コード例 #3
0
ファイル: TestClass.cs プロジェクト: fredatgithub/XSharpDev
        private static CSharpCompilation CreateCompilation(string cmdLine, params CSharpSyntaxTree[] sources)
        {
            MetadataReference[] refs = new MetadataReference[]
            {
                MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location)
            };

            var args       = CSharpCommandLineParser.SplitCommandLineIntoArguments(cmdLine, false);
            var cmdParser  = new CSharpCommandLineParser();
            var parsedArgs = cmdParser.Parse(args, ".", null);

            if (sources.Contains(VulcanRuntime))
            {
                sources = sources.Where(s => s != VulcanRuntime).ToArray();
                refs    = refs.Concat(new[] { LoadVulcanRuntime() }).ToArray();
            }

            return(CSharpCompilation.Create(
                       System.IO.Path.GetRandomFileName(),
                       syntaxTrees: sources,
                       references: refs,
                       options: parsedArgs.CompilationOptions.WithOutputKind(OutputKind.DynamicallyLinkedLibrary)
                       ));
        }
コード例 #4
0
ファイル: Processor.cs プロジェクト: wk-j/decompiler
        private Compilation CompileScript(Microsoft.CodeAnalysis.SyntaxTree tree, OptimizationLevel level)
        {
            var references = new MetadataReference[] {
                MetadataReference.CreateFromFile(typeof(Object).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Console).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
            };

            var all = references.Concat(GetReferences());

            var usings  = GetUsings();
            var options = ScriptOptions.Default
                          .WithImports(usings)
                          .WithReferences(references);

            var script = CSharpScript.Create(tree.ToString(), options);
            var com    = script.GetCompilation();

            if (level == OptimizationLevel.Release)
            {
                SetReleaseOptimizationLevel(com);
            }

            return(com);
        }
コード例 #5
0
ファイル: ScriptCompiler.cs プロジェクト: lie112/ApsimX
        /// <summary>Gets a list of assembly names that are needed for compiling.</summary>
        /// <param name="referencedAssemblies"></param>
        /// <param name="modelName">Name of model.</param>
        private IEnumerable <MetadataReference> GetReferenceAssemblies(IEnumerable <MetadataReference> referencedAssemblies, string modelName)
        {
            string runtimePath = Path.GetDirectoryName(typeof(object).Assembly.Location);

            IEnumerable <MetadataReference> references = new MetadataReference[]
            {
                MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "netstandard.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "mscorlib.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "System.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "System.Collections.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "System.Linq.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "System.Runtime.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "System.Core.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "System.Data.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "System.Xml.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "System.Xml.ReaderWriter.dll")),
                MetadataReference.CreateFromFile(Path.Join(runtimePath, "System.Private.Xml.dll")),
                MetadataReference.CreateFromFile(typeof(MathUtilities).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(IModel).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(APSIM.Shared.Documentation.CodeDocumentation).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(MathNet.Numerics.Fit).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Newtonsoft.Json.JsonIgnoreAttribute).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(System.Drawing.Color).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(System.Data.DataTable).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(System.ComponentModel.TypeConverter).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Console).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(System.IO.File).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(System.IO.Pipes.PipeStream).Assembly.Location),
            };

            if (previousCompilations != null)
            {
                references = references.Concat(previousCompilations.Where(p => !p.ModelFullPath.Contains($".{modelName}"))
                                               .Select(p => p.Reference));
            }
            if (referencedAssemblies != null)
            {
                references = references.Concat(referencedAssemblies);
            }

            return(references.Where(r => r != null));
        }
コード例 #6
0
        /// <summary>
        /// returns a collection of MetaDataReference objects needed to compile the proxy
        /// this includes some standard references, the TInterface, and any types utilized by the TInterface methods
        /// </summary>
        /// <typeparam name="TInterface">the service contract to be used</typeparam>
        /// <returns>array of MetadataReference objects</returns>
        private static MetadataReference[] GetMetadataReferences <TInterface>()
        {
            try
            {
                var netstandardAsm = AppDomain.CurrentDomain.GetAssemblies().Single(a => a.GetName().Name == "netstandard");
                var runtimeAsm     = AppDomain.CurrentDomain.GetAssemblies().Single(a => a.GetName().Name == "System.Runtime");
                var collectionsAsm = AppDomain.CurrentDomain.GetAssemblies().Single(a => a.GetName().Name == "System.Collections");
                var svcModelAsm    = AppDomain.CurrentDomain.GetAssemblies().Single(a => a.GetName().Name == "System.Private.ServiceModel");

                // these are the standard metadata references
                var standardMetadataReferences =
                    new MetadataReference[]
                {
                    MetadataReference.CreateFromFile(netstandardAsm.Location),
                    MetadataReference.CreateFromFile(runtimeAsm.Location),
                    MetadataReference.CreateFromFile(collectionsAsm.Location),
                    MetadataReference.CreateFromFile(svcModelAsm.Location),
                    //MetadataReference.CreateFromFile(typeof(System.Object).Assembly.Location),
                    //MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
                    // MetadataReference.CreateFromFile(typeof(ChannelFactory).Assembly.Location),
                    // MetadataReference.CreateFromFile(typeof(DataContractAttribute).Assembly.Location),
                    MetadataReference.CreateFromFile(typeof(TInterface).Assembly.Location),
                };

                // these are the return types (and generic descendants) used by methods on TInterface
                var returnTypes =
                    typeof(TInterface)
                    .GetMethods()
                    .Select(mi => mi.ReturnType)
                    .SelectMany(GetDescendentGenericArguments);

                // these are the parameter types (and generic descendants) used by methods on TInterface
                var parameterTypes =
                    typeof(TInterface)
                    .GetMethods()
                    .SelectMany(mi => mi.GetParameters())
                    .Select(pi => pi.ParameterType)
                    .SelectMany(GetDescendentGenericArguments);

                // now get the MetadataReferences for all of the above
                var interfaceMetadataReferences =
                    returnTypes
                    .Concat(parameterTypes)
                    .Select(tp => MetadataReference.CreateFromFile(tp.Assembly.Location));

                // and combine the standard and interface metadata, remove duplicates, and turn to array
                return(standardMetadataReferences.Concat(interfaceMetadataReferences).Distinct().ToArray());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }
        }
コード例 #7
0
ファイル: Processor.cs プロジェクト: wk-j/decompiler
        private Compilation CompileCSharp(Microsoft.CodeAnalysis.SyntaxTree tree, OptimizationLevel level)
        {
            var references = new MetadataReference[] {
                MetadataReference.CreateFromFile(typeof(Object).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Console).Assembly.Location),
            };

            var all = references.Concat(GetReferences());
            var com = CSharpCompilation.Create(
                "Hello",
                syntaxTrees: new[] { tree },
                references: all,
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
                .WithOptimizationLevel(level)
                );

            return(com);
        }
コード例 #8
0
ファイル: Program.cs プロジェクト: sanch0s/RoslynAssembly
        // a utility method that creates Roslyn compilation
        // for the passed code.
        // The compilation references the collection of
        // passed "references" arguments plus
        // the mscore library (which is required for the basic
        // functionality).
        private static CSharpCompilation CreateCompilationWithMscorlib
        (
            string assemblyOrModuleName,
            string code,
            CSharpCompilationOptions compilerOptions   = null,
            IEnumerable <MetadataReference> references = null)
        {
            // create the syntax tree
            SyntaxTree syntaxTree = SyntaxFactory.ParseSyntaxTree(code, null, "");

            // get the reference to mscore library
            MetadataReference mscoreLibReference =
                AssemblyMetadata
                .CreateFromFile(typeof(string).Assembly.Location)
                .GetReference();

            // create the allReferences collection consisting of
            // mscore reference and all the references passed to the method
            IEnumerable <MetadataReference> allReferences =
                new MetadataReference[] { mscoreLibReference };

            if (references != null)
            {
                allReferences = allReferences.Concat(references);
            }

            // create and return the compilation
            CSharpCompilation compilation = CSharpCompilation.Create
                                            (
                assemblyOrModuleName,
                new[] { syntaxTree },
                options: compilerOptions,
                references: allReferences
                                            );

            return(compilation);
        }
コード例 #9
0
        private static CSharpCompilation CreateCompilationWithMscorlib(string assemblyName, string code, CSharpCompilationOptions compilerOptions = null, IEnumerable <MetadataReference> references = null)
        {
            SourceText sourceText = SourceText.From(code, Encoding.UTF8);
            SyntaxTree syntaxTree = SyntaxFactory.ParseSyntaxTree(sourceText, null, "");

            MetadataReference mscoreLibReference = AssemblyMetadata.CreateFromFile(typeof(string).Assembly.Location).GetReference();

            IEnumerable <MetadataReference> allReferences = new MetadataReference[] { mscoreLibReference };

            if (references != null)
            {
                allReferences = allReferences.Concat(references);
            }

            CSharpCompilation compilation = CSharpCompilation.Create
                                            (
                assemblyName,
                new[] { syntaxTree },
                options: compilerOptions,
                references: allReferences
                                            );

            return(compilation);
        }
コード例 #10
0
        public void PortableLibrary()
        {
            var mscorlibPP7 = AssemblyMetadata.CreateFromImage(ProprietaryTestResources.NetFX.ReferenceAssemblies_PortableProfile7.mscorlib).GetReference(display: "mscorlib, PP7");
            var systemRuntimePP7 = AssemblyMetadata.CreateFromImage(ProprietaryTestResources.NetFX.ReferenceAssemblies_PortableProfile7.System_Runtime).GetReference(display: "System.Runtime, PP7");
            var systemRuntimeFacade = AssemblyMetadata.CreateFromImage(ProprietaryTestResources.NetFX.ReferenceAssemblies_V45_Facades.System_Runtime).GetReference(display: "System.Runtime, facade");

            var plSource = @"public class C {}";
            var pl = CreateCompilation(plSource, new[] { mscorlibPP7, systemRuntimePP7 });

            var mainRefs = new MetadataReference[]
            {
                new CSharpCompilationReference(pl),
                MetadataReference.CreateFromImage(ProprietaryTestResources.NetFX.ReferenceAssemblies_V45.mscorlib)
            };

            var mainSource = @"public class D : C { }";

            // w/o facades:

            var main = CreateCompilation(mainSource, mainRefs, options: TestOptions.ReleaseDll);

            main.VerifyDiagnostics(
                // (1,18): error CS0012: The type 'System.Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
                Diagnostic(ErrorCode.ERR_NoTypeDef, "C").WithArguments("System.Object", "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"));

            // facade specified:

            main = CreateCompilation(mainSource, mainRefs.Concat(new[] { systemRuntimeFacade }));
            main.VerifyDiagnostics();
        }
コード例 #11
0
        public void PortableLibrary()
        {
            var mscorlibPP7 = new MetadataImageReference(ProprietaryTestResources.NetFX.ReferenceAssemblies_PortableProfile7.mscorlib, display: "mscorlib, PP7");
            var systemRuntimePP7 = new MetadataImageReference(ProprietaryTestResources.NetFX.ReferenceAssemblies_PortableProfile7.System_Runtime, display: "System.Runtime, PP7");

            var plSource = @"public class C {}";
            var pl = CreateCompilation(plSource, new[] { mscorlibPP7, systemRuntimePP7 });

            var dir = Temp.CreateDirectory();
            var mscorlibFile = dir.CreateFile("mscorlib.dll").WriteAllBytes(ProprietaryTestResources.NetFX.ReferenceAssemblies_V45.mscorlib);
            
            var mainRefs = new MetadataReference[] 
            {
                new CSharpCompilationReference(pl), 
                new MetadataFileReference(mscorlibFile.Path, MetadataReferenceProperties.Assembly)
            };

            var mainSource = @"public class D : C { }";
           
            // w/o facades:

            var main = CreateCompilation(mainSource, mainRefs);
            main.VerifyDiagnostics(
                // (1,18): error CS0012: The type 'System.Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
                Diagnostic(ErrorCode.ERR_NoTypeDef, "C").WithArguments("System.Object", "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"));

            // empty facades directory:

            main.VerifyDiagnostics(
                // (1,18): error CS0012: The type 'System.Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
                Diagnostic(ErrorCode.ERR_NoTypeDef, "C").WithArguments("System.Object", "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"));

            // System.Runtime facade present:
            var facades = dir.CreateDirectory("Facades");
            var systemRuntimeFacade = facades.CreateFile("System.Runtime.dll").WriteAllBytes(ProprietaryTestResources.NetFX.ReferenceAssemblies_V45_Facades.System_Runtime);

            main = CreateCompilation(mainSource, mainRefs);
            main.VerifyDiagnostics();

            var expectedReferences = new string[] 
            { 
                "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", 
                pl.AssemblyName + ", Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", 
                "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
            };

            AssertEx.Equal(expectedReferences, main.ReferencedAssemblyNames.Select(n => n.GetDisplayName()));
            AssertEx.Equal(expectedReferences, main.GetBoundReferenceManager().ReferencedAssembliesMap.Values.Select(ra => ra.Symbol.Identity.GetDisplayName()));


            // facade explicitly specified:

            main = CreateCompilation(mainSource, mainRefs.Concat(new[] { new MetadataFileReference(systemRuntimeFacade.Path, MetadataReferenceProperties.Assembly) }));
            main.VerifyDiagnostics();
        }
コード例 #12
0
 internal static AssemblySymbol[] GetSymbolsForReferences(MetadataReference[] mrefs, Compilation[] compilations)
 {
     return GetSymbolsForReferences(
         mrefs: mrefs.Concat(compilations.Select(c => c.ToMetadataReference())).ToArray());
 }