示例#1
0
        internal static List <IAssemblyReference> ToAssemblyReferences(IEnumerable <AssemblyDefinition> references, ILogger logger)
        {
            logger.Info("Assembly definition to references...");

            var list = new List <IAssemblyReference>();

            if (references == null)
            {
                return(list);
            }

            foreach (var reference in references)
            {
                logger.Trace("\tLoading AssemblyDefinition " + (reference != null && reference.Name != null && reference.Name.Name != null ? reference.Name.Name : "") + " ...");

                var loader = new CecilLoader();
                loader.IncludeInternalMembers = true;

                list.Add(loader.LoadAssembly(reference));

                logger.Trace("\tLoading AssemblyDefinition done");
            }

            logger.Info("Assembly definition to references done");

            return(list);
        }
示例#2
0
        public CSharpCompletion()
        {
            projectContent = new CSharpProjectContent();
            var assemblies = new List <Assembly>
            {
                typeof(object).Assembly,     // mscorlib
                typeof(Uri).Assembly,        // System.dll
                typeof(Enumerable).Assembly, // System.Core.dll
//					typeof(System.Xml.XmlDocument).Assembly, // System.Xml.dll
//					typeof(System.Drawing.Bitmap).Assembly, // System.Drawing.dll
//					typeof(Form).Assembly, // System.Windows.Forms.dll
//					typeof(ICSharpCode.NRefactory.TypeSystem.IProjectContent).Assembly,
            };

            var       unresolvedAssemblies = new IUnresolvedAssembly[assemblies.Count];
            Stopwatch total = Stopwatch.StartNew();

            Parallel.For(
                0, assemblies.Count,
                delegate(int i)
            {
                var loader = new CecilLoader();
                var path   = assemblies[i].Location;
                loader.DocumentationProvider = GetXmlDocumentation(assemblies[i].Location);
                unresolvedAssemblies[i]      = loader.LoadAssemblyFile(assemblies[i].Location);
            });
            Debug.WriteLine("Init project content, loading base assemblies: " + total.Elapsed);
            projectContent = projectContent.AddAssemblyReferences((IEnumerable <IUnresolvedAssembly>)unresolvedAssemblies);
        }
        private static IList <Tuple <IUnresolvedAssembly, IList <string>, Assembly> > LoadReferences(IEnumerable <string> references, IErrorReporter er)
        {
            var loader = new CecilLoader {
                IncludeInternalMembers = true
            };
            var assemblies = references.Select(r => AssemblyDefinition.ReadAssembly(r)).ToList();             // Shouldn't result in errors because mcs would have caught it.

            var indirectReferences = (from a in assemblies
                                      from m in a.Modules
                                      from r in m.AssemblyReferences
                                      select r.Name)
                                     .Distinct();

            var directReferences = from a in assemblies select a.Name.Name;

            var missingReferences = indirectReferences.Except(directReferences).ToList();

            if (missingReferences.Count > 0)
            {
                er.Region = DomRegion.Empty;
                foreach (var r in missingReferences)
                {
                    er.Message(Messages._7996, r);
                }
                return(null);
            }

            return(assemblies.Select(asm => Tuple.Create(loader.LoadAssembly(asm), GetReferencedAssemblyNames(asm), LoadPlugin(asm))).ToList());
        }
示例#4
0
        static IEnumerable <ITypeDefinition> LoadTypes()
        {
            var tt = typeof(File).Assembly.Location;

            Reflector.OutputDir = Environment.CurrentDirectory;

            var asmFile = Assembly.GetExecutingAssembly().Location;
            //asmFile = "".GetType().Assembly.Location;

            string xmlFile = Path.GetFullPath(Path.GetFileNameWithoutExtension(asmFile) + ".xml");

            XmlDocumentationProvider doc = MonoCompletionEngine.GetXmlDocumentation(asmFile);

            if (doc == null && File.Exists(xmlFile))
            {
                doc = new XmlDocumentationProvider(xmlFile);
            }

            var loader = new CecilLoader {
                DocumentationProvider = doc
            };
            var unresolvedAsm = loader.LoadAssemblyFile(asmFile);
            var compilation   = new SimpleCompilation(unresolvedAsm);
            var context       = new SimpleTypeResolveContext(compilation);
            var asm           = unresolvedAsm.Resolve(context);

            return(asm.GetAllTypeDefinitions().ToArray());
        }
 public ModuleMetadataInfo(Module module, Mono.Cecil.ModuleDefinition cecilModule)
 {
     this.Module      = module;
     this.CecilModule = cecilModule;
     typeRefLoader    = new CecilLoader();
     typeRefLoader.SetCurrentModule(cecilModule);
 }
示例#6
0
        public List <ReferenceSegment> Decompile(TextEditorData data, ITreeNavigator navigator, bool publicOnly)
        {
            if (DomMethodNodeBuilder.HandleSourceCodeEntity(navigator, data))
            {
                return(null);
            }
            var type = CecilLoader.GetCecilObject((IUnresolvedTypeDefinition)navigator.DataItem);

            if (type == null)
            {
                return(null);
            }
            var settings = new DecompilerSettings()
            {
                AnonymousMethods     = true,
                AutomaticEvents      = true,
                AutomaticProperties  = true,
                ForEachStatement     = true,
                LockStatement        = true,
                HideNonPublicMembers = publicOnly
            };

            return(DomMethodNodeBuilder.Decompile(data, DomMethodNodeBuilder.GetModule(navigator), type, builder => {
                builder.AddType(type);
            }, settings));
        }
示例#7
0
        public IEnumerable <ILLocalVariable> GetLocalVariables(IMethod method)
        {
            string id   = IdStringProvider.GetIdString(method.MemberDefinition);
            var    file = GetSymbols(method);

            if (file == null || !file.DebugSymbols.ContainsKey(id))
            {
                return(Enumerable.Empty <ILLocalVariable>());
            }

            var symbols = file.DebugSymbols[id];

            var context = new SimpleTypeResolveContext(method);
            var loader  = new CecilLoader();

            return(symbols.LocalVariables.Where(v => v.OriginalVariable != null).Select(
                       v => new Debugger.ILLocalVariable()
            {
                Index = v.OriginalVariable.Index,
                Type = loader.ReadTypeReference(v.Type).Resolve(context),
                Name = v.Name,
                IsCompilerGenerated = false,
                ILRanges = new [] { new ILRange(0, int.MaxValue) }
            }));
        }
示例#8
0
        public AssemblyLoader(AssemblyBrowserWidget widget, string fileName)
        {
            if (widget == null)
            {
                throw new ArgumentNullException(nameof(widget));
            }
            if (fileName == null)
            {
                throw new ArgumentNullException(nameof(fileName));
            }
            this.widget = widget;
            FileName    = fileName;
            if (!File.Exists(fileName))
            {
                throw new ArgumentException("File doesn't exist.", nameof(fileName));
            }

            loader = new CecilLoader(true);
            loader.InterningProvider      = new FastNonInterningProvider();
            loader.IncludeInternalMembers = true;
            loader.LazyLoad = true;

            assemblyLoaderTask = Task.Run(() => {
                try {
                    var asm = AssemblyDefinition.ReadAssembly(FileName, new ReaderParameters {
                        AssemblyResolver = this
                    });
                    var loadedAssembley = loader.LoadAssembly(asm);
                    return(Tuple.Create(asm, loadedAssembley));
                } catch (Exception e) {
                    LoggingService.LogError("Error while reading assembly " + FileName, e);
                    return(null);
                }
            }, src.Token);
        }
示例#9
0
        public static IList <ITypeDefinition> GetNestedTypes(AssemblyDefinition assemblyDefinition, string fullTypeName)
        {
            var loader = new CecilLoader();

            loader.IncludeInternalMembers = true;

            var bridgeAssemblyDefinition = MonoCecilAssemblyHelper.GetBridgeAssemlyDefinition();
            var bridgeAssembly           = loader.LoadAssembly(bridgeAssemblyDefinition);

            IProjectContent project = new CSharpProjectContent();

            project = project.AddAssemblyReferences(bridgeAssembly);

            var compilation = project.CreateCompilation();

            var ctx = new SimpleTypeResolveContext(compilation);

            var unresolvedAssembly = loader.LoadAssembly(assemblyDefinition);
            var assembly           = unresolvedAssembly.Resolve(ctx);

            var parentType = assembly.GetAllTypeDefinitions().FirstOrDefault(x => x.FullName == fullTypeName);

            if (parentType == null)
            {
                return(new List <ITypeDefinition>());
            }

            var nested = parentType.NestedTypes;

            return(nested);
        }
示例#10
0
        public void ResetProject(Tuple <string, string>[] sourceFiles = null, params string[] assemblies)
        {
            Project = null;

            if (sourceFiles == null)
            {
                sourceFiles = new Tuple <string, string> [0]; //will happen only during the testing
            }
            var projectContents = new IUnresolvedAssembly[assemblies.Length];

            Parallel.For(0, assemblies.Length, i =>
            {
                projectContents[i] = new CecilLoader {
                    DocumentationProvider = GetXmlDocumentation(assemblies[i])
                }.LoadAssemblyFile(assemblies[i]);
            });

            var unresolvedAsms  = builtInLibs.Value.Concat(projectContents);
            var unresolvedFiles = new IUnresolvedFile[sourceFiles.Length];

            Parallel.For(0, unresolvedFiles.Length, i =>
            {
                var pair       = sourceFiles[i];
                var syntaxTree = new CSharpParser().Parse(pair.Item1, pair.Item2);
                syntaxTree.Freeze();
                unresolvedFiles[i] = syntaxTree.ToTypeSystem();
            });

            IProjectContent project = new CSharpProjectContent();

            project = project.AddAssemblyReferences(unresolvedAsms);
            project = project.AddOrUpdateFiles(unresolvedFiles);
            Project = project;
        }
示例#11
0
        public CSharpCompletion()
        {
            projectContent = new CSharpProjectContent();
            var assemblies = new List <Assembly>
            {
                typeof(object).Assembly,                                                     // mscorlib
                typeof(Uri).Assembly,                                                        // System.dll
                typeof(Enumerable).Assembly,                                                 // System.Core.dll
                typeof(System.Xml.XmlDocument).Assembly,                                     // System.Xml.dll
                typeof(Sandbox.Common.ObjectBuilders.MyObjectBuilder_AdvancedDoor).Assembly, // SpaceEngineers.ObjectBuilders.dll
                typeof(SpaceEngineers.Game.ModAPI.IMyButtonPanel).Assembly,                  // SpaceEngineers.Game.dll
                typeof(Sandbox.MySandboxGame).Assembly,                                      // Sandbox.Game.dll
                typeof(Sandbox.ModAPI.MyAPIGateway).Assembly,                                // Sandbox.Common.dll
                typeof(Sandbox.Graphics.GUI.MyGuiSandbox).Assembly,                          // Sandbox.Graphics.dll
                typeof(VRage.MyModelData).Assembly,                                          // VRage.dll
                typeof(VRage.Exceptions).Assembly,                                           // VRage.Library.dll
                typeof(VRageMath.MathHelper).Assembly,                                       // VRage.Math
                typeof(VRage.Game.ObjectBuilders.MyObjectBuilder_EntityStat).Assembly,       //VRage.Game
            };

            var       unresolvedAssemblies = new IUnresolvedAssembly[assemblies.Count];
            Stopwatch total = Stopwatch.StartNew();

            Parallel.For(
                0, assemblies.Count,
                delegate(int i)
            {
                var loader = new CecilLoader();
                var path   = assemblies[i].Location;
                loader.DocumentationProvider = GetXmlDocumentation(assemblies[i].Location);
                unresolvedAssemblies[i]      = loader.LoadAssemblyFile(assemblies[i].Location);
            });
            Debug.WriteLine("Init project content, loading base assemblies: " + total.Elapsed);
            projectContent = projectContent.AddAssemblyReferences((IEnumerable <IUnresolvedAssembly>)unresolvedAssemblies);
        }
        public List <ReferenceSegment> Decompile(TextEditorData data, ITreeNavigator navigator, bool publicOnly)
        {
            if (DomMethodNodeBuilder.HandleSourceCodeEntity(navigator, data))
            {
                return(null);
            }
            var type = CecilLoader.GetCecilObject((IUnresolvedTypeDefinition)navigator.DataItem);

            if (type == null)
            {
                return(null);
            }
            var types      = DesktopService.GetMimeTypeInheritanceChain(data.Document.MimeType);
            var codePolicy = MonoDevelop.Projects.Policies.PolicyService.GetDefaultPolicy <MonoDevelop.CSharp.Formatting.CSharpFormattingPolicy> (types);
            var settings   = new DecompilerSettings()
            {
                AnonymousMethods        = true,
                AutomaticEvents         = true,
                AutomaticProperties     = true,
                ForEachStatement        = true,
                LockStatement           = true,
                CSharpFormattingOptions = codePolicy.CreateOptions()

                                          //,
//				HideNonPublicMembers = publicOnly
            };

            return(DomMethodNodeBuilder.Decompile(data, DomMethodNodeBuilder.GetModule(navigator), type, builder =>
            {
                builder.AddType(type);
            }, settings));
        }
示例#13
0
        /// <summary>
        /// Loads the assemblies needed to generate completion options.
        /// </summary>
        /// <param name="assemblies">List of assemblies. If nothing is passed in, a default list will be used.</param>
        /// <returns>List of assemblies.</returns>
        /// <remarks>This is an expensive operation.</remarks>
        private static IUnresolvedAssembly[] GetAssemblies(List <Assembly> assemblies = null)
        {
            // List of assemblies frequently used in manager scripts.
            // These assemblies get used by the CSharpCompletion object to look for intellisense options.
            // Would be better to dynamically generate this list based on the user's script. The disadvantage of doing it that way
            // is that loading these assemblies into the CSharpCompletion object is quite slow.
            if (assemblies == null)
            {
                assemblies = new List <Assembly>
                {
                    typeof(object).Assembly,                                 // mscorlib
                    typeof(Uri).Assembly,                                    // System.dll
                    typeof(System.Linq.Enumerable).Assembly,                 // System.Core.dll
                    typeof(System.Xml.XmlDocument).Assembly,                 // System.Xml.dll
                    typeof(System.Drawing.Bitmap).Assembly,                  // System.Drawing.dll
                    typeof(IProjectContent).Assembly,
                    typeof(Models.Core.IModel).Assembly,                     // Models.exe
                    typeof(APSIM.Shared.Utilities.StringUtilities).Assembly, // APSIM.Shared.dll
                }
            }
            ;
            assemblies = assemblies.Where(v => !v.IsDynamic).ToList();

            IUnresolvedAssembly[] assemblyList = new IUnresolvedAssembly[assemblies.Count];
            for (int i = 0; i < assemblies.Count; i++)
            {
                var loader = new CecilLoader();
                loader.DocumentationProvider = GetXmlDocumentation(assemblies[i].Location);
                assemblyList[i] = loader.LoadAssemblyFile(assemblies[i].Location);
            }
            return(assemblyList);
        }
    }
        private IUnresolvedAssembly Load(Assembly assembly)
        {
            var loader = new CecilLoader {
                DocumentationProvider = GetXmlDocumentation(assembly.Location)
            };

            return(loader.LoadAssemblyFile(assembly.Location));
        }
        List <ReferenceSegment> IAssemblyBrowserNodeBuilder.Decompile(TextEditorData data, ITreeNavigator navigator, bool publicOnly)
        {
            if (DomMethodNodeBuilder.HandleSourceCodeEntity(navigator, data))
            {
                return(null);
            }
            var field = CecilLoader.GetCecilObject((IUnresolvedField)navigator.DataItem);

            return(DomMethodNodeBuilder.Decompile(data, DomMethodNodeBuilder.GetModule(navigator), field.DeclaringType, b => b.AddField(field)));
        }
示例#16
0
        List <ReferenceSegment> IAssemblyBrowserNodeBuilder.GetSummary(TextEditorData data, ITreeNavigator navigator, bool publicOnly)
        {
            if (DomMethodNodeBuilder.HandleSourceCodeEntity(navigator, data))
            {
                return(null);
            }
            var property = CecilLoader.GetCecilObject((IUnresolvedProperty)navigator.DataItem);

            return(DomMethodNodeBuilder.GetSummary(data, DomMethodNodeBuilder.GetModule(navigator), property.DeclaringType, b => b.AddProperty(property)));
        }
        List <ReferenceSegment> IAssemblyBrowserNodeBuilder.Disassemble(TextEditorData data, ITreeNavigator navigator)
        {
            if (DomMethodNodeBuilder.HandleSourceCodeEntity(navigator, data))
            {
                return(null);
            }
            var field = CecilLoader.GetCecilObject((IUnresolvedField)navigator.DataItem);

            return(DomMethodNodeBuilder.Disassemble(data, rd => rd.DisassembleField(field)));
        }
示例#18
0
        public CSharpAmbienceTests()
        {
            ambience = new CSharpAmbience();
            mscorlib = CecilLoaderTests.Mscorlib;
            var loader = new CecilLoader();

            loader.IncludeInternalMembers = true;
            myLib       = loader.LoadAssemblyFile(typeof(CSharpAmbienceTests).Assembly.Location);
            compilation = new SimpleCompilation(myLib, mscorlib);
        }
示例#19
0
        public void SetUp()
        {
            snippetGenerator = new SnippetGenerator(true);
            var loader = new CecilLoader();

            loader.IncludeInternalMembers = true;
            myLib       = loader.LoadAssemblyFile(typeof(SnippetGenerationTests).Assembly.Location);
            mscorlib    = loader.LoadAssemblyFile(typeof(object).Assembly.Location);
            compilation = new SimpleCompilation(myLib, mscorlib);
        }
示例#20
0
        public void FixtureSetUp()
        {
            CecilLoader loader = new CecilLoader()
            {
                IncludeInternalMembers = true, LazyLoad = true
            };
            IUnresolvedAssembly pc = loader.LoadAssemblyFile(typeof(TestCase.SimplePublicClass).Assembly.Location);

            base.compilation = new SimpleCompilation(pc, CecilLoaderTests.Mscorlib);
        }
示例#21
0
        public void FixtureSetUp()
        {
            // use "IncludeInternalMembers" so that Cecil results match C# parser results
            CecilLoader loader = new CecilLoader()
            {
                IncludeInternalMembers = true
            };

            testCasePC = loader.LoadAssemblyFile(typeof(TestCase.SimplePublicClass).Assembly.Location);
        }
示例#22
0
        LoadedAssembly LoadAssembly(FileName fileName, CancellationToken cancellationToken, bool includeInternalMembers)
        {
            DateTime       lastWriteTime = File.GetLastWriteTimeUtc(fileName);
            string         cacheFileName = GetCacheFileName(fileName);
            LoadedAssembly pc            = TryReadFromCache(cacheFileName, lastWriteTime);

            if (pc != null)
            {
                if (!includeInternalMembers || includeInternalMembers == pc.HasInternalMembers)
                {
                    return(pc);
                }
            }

            //LoggingService.Debug("Loading " + fileName);
            cancellationToken.ThrowIfCancellationRequested();
            var param = new ReaderParameters();

            param.AssemblyResolver = new DummyAssemblyResolver();
            ModuleDefinition module = ModuleDefinition.ReadModule(fileName, param);

            CecilLoader l = new CecilLoader();

            l.IncludeInternalMembers = includeInternalMembers;
            string xmlDocFile = FindXmlDocumentation(fileName, module.Runtime);

            if (xmlDocFile != null)
            {
                try
                {
                    l.DocumentationProvider = new XmlDocumentationProvider(xmlDocFile);
                }
                catch (XmlException ex)
                {
                    LoggingService.Warn("Ignoring error while reading xml doc from " + xmlDocFile, ex);
                }
                catch (IOException ex)
                {
                    LoggingService.Warn("Ignoring error while reading xml doc from " + xmlDocFile, ex);
                }
                catch (UnauthorizedAccessException ex)
                {
                    LoggingService.Warn("Ignoring error while reading xml doc from " + xmlDocFile, ex);
                }
            }
            l.CancellationToken = cancellationToken;
            var references = module.AssemblyReferences
                             .Select(anr => new DomAssemblyName(anr.FullName));

            pc = new LoadedAssembly(l.LoadModule(module), lastWriteTime, includeInternalMembers, references);
            SaveToCacheAsync(cacheFileName, lastWriteTime, pc).FireAndForget();
            //SaveToCache(cacheFileName, lastWriteTime, pc);
            return(pc);
        }
示例#23
0
        public void SetUp()
        {
            var cecilLoader = new CecilLoader()
            {
                IncludeInternalMembers = true
            };
            var mscorlib   = cecilLoader.LoadAssemblyFile(typeof(object).Assembly.Location);
            var systemCore = cecilLoader.LoadAssemblyFile(typeof(System.Linq.Enumerable).Assembly.Location);

            compilation = new SimpleCompilation(cecilLoader.LoadAssemblyFile(typeof(OverloadResolutionTests).Assembly.Location), mscorlib, systemCore);
        }
示例#24
0
        public void FixtureSetUp()
        {
            // use "IncludeInternalMembers" so that Cecil results match C# parser results
            CecilLoader loader = new CecilLoader()
            {
                IncludeInternalMembers = true
            };
            IUnresolvedAssembly asm = loader.LoadAssemblyFile(typeof(TestCase.SimplePublicClass).Assembly.Location);

            compilation = new SimpleCompilation(asm, CecilLoaderTests.Mscorlib);
        }
示例#25
0
        private static IEnumerable <IUnresolvedAssembly> GetProjectReferences(List <string> explicitReferences)
        {
            var loader = new CecilLoader();

            yield return(loader.LoadAssemblyFile(typeof(object).Assembly.Location));

            foreach (var reference in explicitReferences)
            {
                yield return(loader.LoadAssemblyFile(reference));
            }
        }
        public static void AddAssembly(string file)
        {
            if (String.IsNullOrEmpty(file))
            {
                return;
            }

            var loader             = new CecilLoader();
            var unresolvedAssembly = loader.LoadAssemblyFile(file);

            projectContent = projectContent.AddAssemblyReferences(unresolvedAssembly);
        }
示例#27
0
        public MetricsReader(string fileName)
        {
            loader = new CecilLoader(true)
            {
                IncludeInternalMembers = true
            };
            namespaceMappings = new Dictionary <string, NamespaceNode>();
            typeMappings      = new Dictionary <ITypeDefinition, TypeNode>();
            methodMappings    = new Dictionary <IMethod, MethodNode>();
            fieldMappings     = new Dictionary <IField, FieldNode>();
            cecilMappings     = new Dictionary <MemberReference, IEntity>();

            compilation = new SimpleCompilation(loader.LoadAssemblyFile(fileName));

            // TODO load referenced assemblies into compilation.

            Assembly           = new AssemblyNode(compilation.MainAssembly.AssemblyName);
            assemblyDefinition = loader.GetCecilObject(compilation.MainAssembly.UnresolvedAssembly);

            foreach (var type in compilation.MainAssembly.GetAllTypeDefinitions())
            {
                ReadType(type);

                foreach (IMethod method in type.Methods)
                {
                    ReadMethod(method);
                }

                foreach (IProperty property in type.Properties)
                {
                    if (property.CanGet)
                    {
                        ReadMethod(property.Getter);
                    }
                    if (property.CanSet)
                    {
                        ReadMethod(property.Setter);
                    }
                }

                foreach (IField field in type.Fields)
                {
                    ReadField(field);
                }
            }

            foreach (var method in methodMappings.Values)
            {
                ReadInstructions(method, method.Method, loader.GetCecilObject((IUnresolvedMethod)method.Method.UnresolvedMember));
            }

            Assembly.namespaces = namespaceMappings.Values;
        }
示例#28
0
        // Token: 0x06000025 RID: 37 RVA: 0x00002B34 File Offset: 0x00000D34
        private IUnresolvedAssembly LoadAssembly(string path)
        {
            if (this.assemblies.ContainsKey(path))
            {
                return(this.assemblies[path]);
            }
            CecilLoader         cecilLoader        = new CecilLoader();
            IUnresolvedAssembly unresolvedAssembly = cecilLoader.LoadAssemblyFile(path);

            this.assemblies.Add(path, unresolvedAssembly);
            return(unresolvedAssembly);
        }
示例#29
0
        public void ResolveTypeWithUnknownAttributes()
        {
            const String source = "namespace ns\r\n" +
                                  "{\r\n" +
                                  "    public enum EE {v1 = 13, v2 = 666}\r\n" +
                                  "    [System.AttributeUsage(System.AttributeTargets.Method | System.AttributeTargets.Property, AllowMultiple = true)]\r\n" +
                                  "    public class AttrA : System.Attribute\r\n" +
                                  "    {\r\n" +
                                  "    }\r\n" +
                                  "    [System.AttributeUsage(System.AttributeTargets.Method)]\r\n" +
                                  "    public class AttrB : System.Attribute\r\n" +
                                  "    {\r\n" +
                                  "        public AttrB(int i, string s, EE e) {}\r\n" +
                                  "    }\r\n" +
                                  "    public class SomeClass\r\n" +
                                  "    {\r\n" +
                                  "        [AttrA]\r\n" +
                                  "        [AttrB(666, \"iddqd\", EE.v1)]\r\n" +
                                  "        [AttrC]\r\n" +
                                  "        public void M()\r\n" +
                                  "        { }\r\n" +
                                  "    }\r\n" +
                                  "}";
            CSharpParser parser     = new CSharpParser();
            SyntaxTree   syntaxTree = parser.Parse(source);

            syntaxTree.FileName = "example.cs";
            CSharpUnresolvedFile unresolvedTypeSystem = syntaxTree.ToTypeSystem();
            IProjectContent      content = new CSharpProjectContent();

            content = content.AddOrUpdateFiles(unresolvedTypeSystem);
            CecilLoader         loader = new CecilLoader();
            AssemblyDefinition  mscorlibAssemblyDefinition = AssemblyDefinition.ReadAssembly(typeof(Object).Assembly.Location);
            IUnresolvedAssembly mscorlibAssembly           = loader.LoadAssembly(mscorlibAssemblyDefinition);

            content = content.AddAssemblyReferences(mscorlibAssembly);
            ICompilation        compilation  = content.CreateCompilation();
            CSharpAstResolver   resolver     = new CSharpAstResolver(compilation, syntaxTree);
            MethodDeclaration   method       = syntaxTree.Descendants.OfType <MethodDeclaration>().First(m => m.Name == "M");
            ResolveResult       result       = resolver.Resolve(method);
            MemberResolveResult memberResult = (MemberResolveResult)result;
            IMember             member       = memberResult.Member;

            foreach (IAttribute attribute in member.Attributes)
            {
                Console.WriteLine("attribute.AttributeType = {0}, attribute.AttributeType.Kind = {1}", attribute.AttributeType.FullName, attribute.AttributeType.Kind);
                Console.WriteLine("attribute.PositionalArguments.Count = {0}", attribute.PositionalArguments.Count);
                ProcessPositionalArgs(attribute.PositionalArguments);
                Console.WriteLine("attribute.NamedArguments.Count = {0}", attribute.NamedArguments.Count);
                Console.WriteLine();
            }
        }
示例#30
0
        public DecompilerTypeSystem(ModuleDefinition moduleDefinition)
        {
            if (moduleDefinition == null)
            {
                throw new ArgumentNullException(nameof(moduleDefinition));
            }
            this.moduleDefinition = moduleDefinition;
            CecilLoader cecilLoader = new CecilLoader {
                IncludeInternalMembers = true, LazyLoad = true, OnEntityLoaded = StoreMemberReference, ShortenInterfaceImplNames = false
            };

            typeReferenceCecilLoader.SetCurrentModule(moduleDefinition);
            IUnresolvedAssembly mainAssembly = cecilLoader.LoadModule(moduleDefinition);
            // Load referenced assemblies and type-forwarder references.
            // This is necessary to make .NET Core/PCL binaries work better.
            var referencedAssemblies        = new List <IUnresolvedAssembly>();
            var assemblyReferenceQueue      = new Queue <AssemblyNameReference>(moduleDefinition.AssemblyReferences);
            var processedAssemblyReferences = new HashSet <AssemblyNameReference>(KeyComparer.Create((AssemblyNameReference reference) => reference.FullName));

            while (assemblyReferenceQueue.Count > 0)
            {
                var asmRef = assemblyReferenceQueue.Dequeue();
                if (!processedAssemblyReferences.Add(asmRef))
                {
                    continue;
                }
                var asm = moduleDefinition.AssemblyResolver.Resolve(asmRef);
                if (asm != null)
                {
                    referencedAssemblies.Add(cecilLoader.LoadAssembly(asm));
                    foreach (var forwarder in asm.MainModule.ExportedTypes)
                    {
                        if (!forwarder.IsForwarder || !(forwarder.Scope is AssemblyNameReference forwarderRef))
                        {
                            continue;
                        }
                        assemblyReferenceQueue.Enqueue(forwarderRef);
                    }
                }
            }
            compilation = new SimpleCompilation(mainAssembly, referencedAssemblies);
            // Primitive types are necessary to avoid assertions in ILReader.
            // Fallback to MinimalCorlib to provide the primitive types.
            if (compilation.FindType(KnownTypeCode.Void).Kind == TypeKind.Unknown || compilation.FindType(KnownTypeCode.Int32).Kind == TypeKind.Unknown)
            {
                referencedAssemblies.Add(MinimalCorlib.Instance);
                compilation = new SimpleCompilation(mainAssembly, referencedAssemblies);
            }
            context = new SimpleTypeResolveContext(compilation.MainAssembly);
        }