예제 #1
0
        private WorkItem DecompileSourceFile(DecompilerTypeSystem ts, IGrouping <string, TypeDefinitionHandle> src, string projectName, string conditional = null)
        {
            return(new WorkItem("Decompiling: " + src.Key, updateStatus =>
            {
                var path = Path.Combine(srcDir, projectName, src.Key);
                CreateParentDirectory(path);

                using (var w = new StringWriter())
                {
                    if (conditional != null)
                    {
                        w.WriteLine("#if " + conditional);
                    }

                    CreateDecompiler(ts)
                    .DecompileTypes(src.ToArray())
                    .AcceptVisitor(new CSharpOutputVisitor(w, projectDecompiler.Settings.CSharpFormattingOptions));

                    if (conditional != null)
                    {
                        w.WriteLine("#endif");
                    }

                    string source = w.ToString();
                    if (formatOutput)
                    {
                        updateStatus("Formatting: " + src.Key);
                        source = FormatTask.Format(source, taskInterface.CancellationToken, true);
                    }

                    File.WriteAllText(path, source);
                }
            }));
        }
예제 #2
0
파일: Tester.cs 프로젝트: xxmingming/ILSpy
        public static string DecompileCSharp(string assemblyFileName, DecompilerSettings settings = null)
        {
            if (settings == null)
            {
                settings = new DecompilerSettings();
            }
            using (var file = new FileStream(assemblyFileName, FileMode.Open, FileAccess.Read)) {
                var module   = new PEFile(assemblyFileName, file, PEStreamOptions.PrefetchEntireImage);
                var resolver = new UniversalAssemblyResolver(assemblyFileName, false,
                                                             module.Reader.DetectTargetFrameworkId(), PEStreamOptions.PrefetchMetadata);
                resolver.AddSearchDirectory(Path.GetDirectoryName(typeof(Span <>).Assembly.Location));
                var typeSystem = new DecompilerTypeSystem(module, resolver, settings);
                CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, settings);
                decompiler.AstTransforms.Insert(0, new RemoveEmbeddedAttributes());
                decompiler.AstTransforms.Insert(0, new RemoveCompilerAttribute());
                decompiler.AstTransforms.Insert(0, new RemoveNamespaceMy());
                decompiler.AstTransforms.Add(new EscapeInvalidIdentifiers());
                var syntaxTree = decompiler.DecompileWholeModuleAsSingleFile(sortTypes: true);

                StringWriter output  = new StringWriter();
                var          visitor = new CSharpOutputVisitor(output, FormattingOptionsFactory.CreateSharpDevelop());
                syntaxTree.AcceptVisitor(visitor);

                string fileName = Path.GetTempFileName();
                File.WriteAllText(fileName, output.ToString());

                return(fileName);
            }
        }
예제 #3
0
        /// <summary>
        /// Jumps to the specified reference.
        /// </summary>
        /// <returns>
        /// Returns a task that will signal completion when the decompilation of the jump target has finished.
        /// The task will be marked as canceled if the decompilation is canceled.
        /// </returns>
        public Task JumpToReferenceAsync(object reference)
        {
            decompilationTask = TaskHelper.CompletedTask;
            switch (reference)
            {
            case Decompiler.Disassembler.OpCodeInfo opCode:
                OpenLink(opCode.Link);
                break;

            case ValueTuple <PEFile, System.Reflection.Metadata.EntityHandle> unresolvedEntity:
                var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Item1, unresolvedEntity.Item1.GetAssemblyResolver(),
                                                          TypeSystemOptions.Default | TypeSystemOptions.Uncached);
                reference = typeSystem.MainModule.ResolveEntity(unresolvedEntity.Item2);
                goto default;

            default:
                ILSpyTreeNode treeNode = FindTreeNode(reference);
                if (treeNode != null)
                {
                    SelectNode(treeNode);
                }
                break;
            }
            return(decompilationTask);
        }
예제 #4
0
 public IEnumerable <ITypeDefinition> GetTypesInScope(CancellationToken ct)
 {
     if (IsLocal)
     {
         var             typeSystem = new DecompilerTypeSystem(TypeScope.ParentModule.PEFile, TypeScope.ParentModule.PEFile.GetAssemblyResolver());
         ITypeDefinition scope      = typeScope;
         if (memberAccessibility != Accessibility.Private && typeScope.DeclaringTypeDefinition != null)
         {
             scope = typeScope.DeclaringTypeDefinition;
         }
         foreach (var type in TreeTraversal.PreOrder(scope, t => t.NestedTypes))
         {
             yield return(type);
         }
     }
     else
     {
         foreach (var module in GetModulesInScope(ct))
         {
             var typeSystem = new DecompilerTypeSystem(module, module.GetAssemblyResolver());
             foreach (var type in typeSystem.MainModule.TypeDefinitions)
             {
                 yield return(type);
             }
         }
     }
 }
예제 #5
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));
            }

            assemblyDefinitionTaskSource = new TaskCompletionSource <AssemblyDefinition>();

            assemblyLoaderTask = Task.Run(() => {
                try {
                    var assemblyDefinition = AssemblyDefinition.ReadAssembly(FileName, new ReaderParameters {
                        AssemblyResolver = this
                    });
                    assemblyDefinitionTaskSource.SetResult(assemblyDefinition);
                    DecompilerTypeSystem = new DecompilerTypeSystem(assemblyDefinition.MainModule);
                    var loadedAssembly   = DecompilerTypeSystem.MainAssembly.UnresolvedAssembly;
                    return(Tuple.Create(assemblyDefinition, loadedAssembly));
                }
                catch (Exception e) {
                    LoggingService.LogError("Error while reading assembly " + FileName, e);
                    return(null);
                }
            });
        }
예제 #6
0
        private DecompilerTypeSystem AddModule(PEFile module, IAssemblyResolver resolver, List <WorkItem> items, ISet <string> sourceSet, ISet <string> resourceSet, ICollection <string> exclude = null, string conditional = null)
        {
            var projectDir = GetAssemblyTitle(module);
            var sources    = GetCodeFiles(module).ToList();
            var resources  = GetResourceFiles(module).ToList();

            if (exclude != null)
            {
                sources.RemoveAll(src => exclude.Contains(src.Key));
                resources.RemoveAll(res => exclude.Contains(res.path));
            }

            var ts = new DecompilerTypeSystem(module, resolver, decompilerSettings);

            items.AddRange(sources
                           .Where(src => sourceSet.Add(src.Key))
                           .Select(src => DecompileSourceFile(ts, src, projectDir, conditional)));

            if (conditional != null && resources.Any(res => !resourceSet.Contains(res.path)))
            {
                throw new Exception($"Conditional ({conditional}) resources not supported");
            }

            items.AddRange(resources
                           .Where(res => resourceSet.Add(res.path))
                           .Select(res => ExtractResource(res.path, res.r, projectDir)));

            return(ts);
        }
        ISymbol GetParentEntity(DecompilerTypeSystem ts, CustomAttribute customAttribute)
        {
            var metadata = ts.MainModule.PEFile.Metadata;

            switch (customAttribute.Parent.Kind)
            {
            case HandleKind.MethodDefinition:
            case HandleKind.FieldDefinition:
            case HandleKind.PropertyDefinition:
            case HandleKind.EventDefinition:
            case HandleKind.TypeDefinition:
                return(ts.MainModule.ResolveEntity(customAttribute.Parent));

            case HandleKind.AssemblyDefinition:
            case HandleKind.ModuleDefinition:
                return(ts.MainModule);

            case HandleKind.GenericParameterConstraint:
                var gpc = metadata.GetGenericParameterConstraint((GenericParameterConstraintHandle)customAttribute.Parent);
                var gp  = metadata.GetGenericParameter(gpc.Parameter);
                return(ts.MainModule.ResolveEntity(gp.Parent));

            case HandleKind.GenericParameter:
                gp = metadata.GetGenericParameter((GenericParameterHandle)customAttribute.Parent);
                return(ts.MainModule.ResolveEntity(gp.Parent));

            default:
                return(null);
            }
        }
예제 #8
0
        CSharpDecompiler CreateDecompiler(DecompilerTypeSystem ts)
        {
            var decompiler = new CSharpDecompiler(ts, settings);

            decompiler.AstTransforms.Add(new EscapeInvalidIdentifiers());
            decompiler.AstTransforms.Add(new RemoveCLSCompliantAttribute());
            return(decompiler);
        }
예제 #9
0
 internal TransformContext(DecompilerTypeSystem typeSystem, ITypeResolveContext decompilationContext, TypeSystemAstBuilder typeSystemAstBuilder, DecompilerSettings settings, CancellationToken cancellationToken)
 {
     this.TypeSystem           = typeSystem;
     this.decompilationContext = decompilationContext;
     this.TypeSystemAstBuilder = typeSystemAstBuilder;
     this.Settings             = settings;
     this.CancellationToken    = cancellationToken;
 }
        IEnumerable <ISymbol> HandleCustomAttribute(ITypeDefinition attributeType, AnalyzerScope scope)
        {
            var genericContext = new GenericContext();             // type arguments do not matter for this analyzer.

            foreach (var module in scope.GetAllModules())
            {
                var ts = new DecompilerTypeSystem(module, module.GetAssemblyResolver());
                var referencedParameters = new HashSet <ParameterHandle>();
                foreach (var h in module.Metadata.CustomAttributes)
                {
                    var customAttribute = module.Metadata.GetCustomAttribute(h);
                    var attributeCtor   = ts.MainModule.ResolveMethod(customAttribute.Constructor, genericContext);
                    if (attributeCtor.DeclaringTypeDefinition != null &&
                        attributeCtor.ParentModule.PEFile == attributeType.ParentModule.PEFile &&
                        attributeCtor.DeclaringTypeDefinition.MetadataToken == attributeType.MetadataToken)
                    {
                        if (customAttribute.Parent.Kind == HandleKind.Parameter)
                        {
                            referencedParameters.Add((ParameterHandle)customAttribute.Parent);
                        }
                        else
                        {
                            var parent = GetParentEntity(ts, customAttribute);
                            if (parent != null)
                            {
                                yield return(parent);
                            }
                        }
                    }
                }
                if (referencedParameters.Count > 0)
                {
                    foreach (var h in module.Metadata.MethodDefinitions)
                    {
                        var md = module.Metadata.GetMethodDefinition(h);
                        foreach (var p in md.GetParameters())
                        {
                            if (referencedParameters.Contains(p))
                            {
                                var method = ts.MainModule.ResolveMethod(h, genericContext);
                                if (method != null)
                                {
                                    if (method.IsAccessor)
                                    {
                                        yield return(method.AccessorOwner);
                                    }
                                    else
                                    {
                                        yield return(method);
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }
예제 #11
0
 internal TransformContext(DecompilerTypeSystem typeSystem, DecompileRun decompileRun, ITypeResolveContext decompilationContext, TypeSystemAstBuilder typeSystemAstBuilder)
 {
     this.TypeSystem           = typeSystem;
     this.DecompileRun         = decompileRun;
     this.decompilationContext = decompilationContext;
     this.TypeSystemAstBuilder = typeSystemAstBuilder;
     this.CancellationToken    = decompileRun.CancellationToken;
     this.Settings             = decompileRun.Settings;
 }
예제 #12
0
            public override void DecompileMethod(IMethod method, ITextOutput output, DecompilationOptions options)
            {
                base.DecompileMethod(method, output, options);
                var module    = method.ParentModule.PEFile;
                var metadata  = module.Metadata;
                var methodDef = metadata.GetMethodDefinition((SRM.MethodDefinitionHandle)method.MetadataToken);

                if (!methodDef.HasBody())
                {
                    return;
                }
                IAssemblyResolver assemblyResolver = module.GetAssemblyResolver();
                var typeSystem = new DecompilerTypeSystem(module, assemblyResolver);
                var reader     = new ILReader(typeSystem.MainModule);

                reader.UseDebugSymbols = options.DecompilerSettings.UseDebugSymbols;
                var        methodBody = module.Reader.GetMethodBody(methodDef.RelativeVirtualAddress);
                ILFunction il         = reader.ReadIL((SRM.MethodDefinitionHandle)method.MetadataToken, methodBody, kind: ILFunctionKind.TopLevelFunction, cancellationToken: options.CancellationToken);
                var        decompiler = new CSharpDecompiler(typeSystem, options.DecompilerSettings)
                {
                    CancellationToken = options.CancellationToken
                };
                ILTransformContext context = decompiler.CreateILTransformContext(il);

                context.Stepper.StepLimit = options.StepLimit;
                context.Stepper.IsDebug   = options.IsDebug;
                try
                {
                    il.RunTransforms(transforms, context);
                }
                catch (StepLimitReachedException)
                {
                }
                catch (Exception ex)
                {
                    output.WriteLine(ex.ToString());
                    output.WriteLine();
                    output.WriteLine("ILAst after the crash:");
                }
                finally
                {
                    // update stepper even if a transform crashed unexpectedly
                    if (options.StepLimit == int.MaxValue)
                    {
                        Stepper = context.Stepper;
                        OnStepperUpdated(new EventArgs());
                    }
                }
                (output as ISmartTextOutput)?.AddButton(Images.ViewCode, "Show Steps", delegate {
                    Docking.DockWorkspace.Instance.ShowToolPane(DebugStepsPaneModel.PaneContentId);
                });
                output.WriteLine();
                il.WriteTo(output, DebugSteps.Options);
            }
예제 #13
0
        private CSharpDecompiler CreateDecompiler(DecompilerTypeSystem ts)
        {
            var decompiler = new CSharpDecompiler(ts, projectDecompiler.Settings)
            {
                CancellationToken = taskInterface.CancellationToken
            };

            decompiler.AstTransforms.Add(new EscapeInvalidIdentifiers());
            decompiler.AstTransforms.Add(new RemoveCLSCompliantAttribute());
            return(decompiler);
        }
예제 #14
0
            public override void DecompileMethod(MethodDefinition method, ITextOutput output, DecompilationOptions options)
            {
                base.DecompileMethod(method, output, options);
                if (!method.HasBody)
                {
                    return;
                }
                var      typeSystem = new DecompilerTypeSystem(method.Module);
                ILReader reader     = new ILReader(typeSystem);

                reader.WriteTypedIL(method.Body, output, options.CancellationToken);
            }
예제 #15
0
        public override string GetTooltip(MemberReference member)
        {
            var     decompilerTypeSystem = new DecompilerTypeSystem(member.Module);
            ISymbol symbol;

            switch (member)
            {
            case MethodReference mr:
                symbol = decompilerTypeSystem.Resolve(mr);
                if (symbol == null)
                {
                    return(base.GetTooltip(member));
                }
                break;

            case PropertyReference pr:
                symbol = decompilerTypeSystem.Resolve(pr);
                if (symbol == null)
                {
                    return(base.GetTooltip(member));
                }
                break;

            case EventReference er:
                symbol = decompilerTypeSystem.Resolve(er);
                if (symbol == null)
                {
                    return(base.GetTooltip(member));
                }
                break;

            case FieldReference fr:
                symbol = decompilerTypeSystem.Resolve(fr);
                if (symbol == null)
                {
                    return(base.GetTooltip(member));
                }
                break;

            default:
                return(base.GetTooltip(member));
            }
            var flags = ConversionFlags.All & ~ConversionFlags.ShowBody;

            return(new CSharpAmbience()
            {
                ConversionFlags = flags
            }.ConvertSymbol(symbol));
        }
예제 #16
0
        internal static void AddBaseTypes(SharpTreeNodeCollection children, PEFile module, ITypeDefinition typeDefinition)
        {
            TypeDefinitionHandle handle     = (TypeDefinitionHandle)typeDefinition.MetadataToken;
            DecompilerTypeSystem typeSystem = new DecompilerTypeSystem(module, module.GetAssemblyResolver(),
                                                                       TypeSystemOptions.Default | TypeSystemOptions.Uncached);
            var t = typeSystem.MainModule.ResolveEntity(handle) as ITypeDefinition;

            foreach (var td in t.GetAllBaseTypeDefinitions().Reverse().Skip(1))
            {
                if (t.Kind != TypeKind.Interface || t.Kind == td.Kind)
                {
                    children.Add(new BaseTypesEntryNode(td));
                }
            }
        }
예제 #17
0
        protected override void LoadChildren()
        {
            var module = LoadedAssembly.GetPEFileOrNull();

            if (module == null)
            {
                // if we crashed on loading, then we don't have any children
                return;
            }
            typeSystem = LoadedAssembly.GetTypeSystemOrNull(DecompilerTypeSystem.GetOptions(new DecompilationOptions().DecompilerSettings));
            var assembly = (MetadataModule)typeSystem.MainModule;
            var metadata = module.Metadata;

            this.Children.Add(new Metadata.MetadataTreeNode(module, this));
            Decompiler.DebugInfo.IDebugInfoProvider debugInfo = LoadedAssembly.GetDebugInfoOrNull();
            if (debugInfo is Decompiler.PdbProvider.PortableDebugInfoProvider ppdb)
            {
                this.Children.Add(new Metadata.DebugMetadataTreeNode(module, ppdb.IsEmbedded, ppdb.Provider.GetMetadataReader(), this));
            }
            this.Children.Add(new ReferenceFolderTreeNode(module, this));
            if (module.Resources.Any())
            {
                this.Children.Add(new ResourceListTreeNode(module));
            }
            foreach (NamespaceTreeNode ns in namespaces.Values)
            {
                ns.Children.Clear();
            }
            foreach (var type in assembly.TopLevelTypeDefinitions.OrderBy(t => t.ReflectionName, NaturalStringComparer.Instance))
            {
                var escapedNamespace = Language.EscapeName(type.Namespace);
                if (!namespaces.TryGetValue(type.Namespace, out NamespaceTreeNode ns))
                {
                    ns = new NamespaceTreeNode(escapedNamespace);
                    namespaces.Add(type.Namespace, ns);
                }
                TypeTreeNode node = new TypeTreeNode(type, this);
                typeDict[(TypeDefinitionHandle)type.MetadataToken] = node;
                ns.Children.Add(node);
            }
            foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name, NaturalStringComparer.Instance))
            {
                if (ns.Children.Count > 0)
                {
                    this.Children.Add(ns);
                }
            }
        }
예제 #18
0
		IEnumerable<(string itemType, string fileName)> WriteAssemblyInfo(DecompilerTypeSystem ts, CancellationToken cancellationToken)
		{
			var decompiler = CreateDecompiler(ts);
			decompiler.CancellationToken = cancellationToken;
			decompiler.AstTransforms.Add(new RemoveCompilerGeneratedAssemblyAttributes());
			SyntaxTree syntaxTree = decompiler.DecompileModuleAndAssemblyAttributes();

			const string prop = "Properties";
			if (directories.Add(prop))
				Directory.CreateDirectory(Path.Combine(TargetDirectory, prop));
			string assemblyInfo = Path.Combine(prop, "AssemblyInfo.cs");
			using (StreamWriter w = new StreamWriter(Path.Combine(TargetDirectory, assemblyInfo)))
			{
				syntaxTree.AcceptVisitor(new CSharpOutputVisitor(w, Settings.CSharpFormattingOptions));
			}
			return new[] { ("Compile", assemblyInfo) };
예제 #19
0
            public override void DecompileMethod(IMethod method, ITextOutput output, DecompilationOptions options)
            {
                base.DecompileMethod(method, output, options);
                var module    = method.ParentModule.PEFile;
                var methodDef = module.Metadata.GetMethodDefinition((SRM.MethodDefinitionHandle)method.MetadataToken);

                if (!methodDef.HasBody())
                {
                    return;
                }
                var      typeSystem = new DecompilerTypeSystem(module, module.GetAssemblyResolver());
                ILReader reader     = new ILReader(typeSystem.MainModule);
                var      methodBody = module.Reader.GetMethodBody(methodDef.RelativeVirtualAddress);

                reader.WriteTypedIL((SRM.MethodDefinitionHandle)method.MetadataToken, methodBody, output, cancellationToken: options.CancellationToken);
            }
예제 #20
0
        IEnumerable <Tuple <string, string> > WriteCodeFilesInProject(Metadata.PEFile module, CancellationToken cancellationToken)
        {
            var metadata = module.Metadata;
            var files    = module.Metadata.GetTopLevelTypeDefinitions().Where(td => IncludeTypeWhenDecompilingProject(module, td)).GroupBy(
                delegate(TypeDefinitionHandle h) {
                var type    = metadata.GetTypeDefinition(h);
                string file = CleanUpFileName(metadata.GetString(type.Name)) + ".cs";
                if (string.IsNullOrEmpty(metadata.GetString(type.Namespace)))
                {
                    return(file);
                }
                else
                {
                    string dir = CleanUpFileName(metadata.GetString(type.Namespace));
                    if (directories.Add(dir))
                    {
                        Directory.CreateDirectory(Path.Combine(targetDirectory, dir));
                    }
                    return(Path.Combine(dir, file));
                }
            }, StringComparer.OrdinalIgnoreCase).ToList();
            int total               = files.Count;
            var progress            = this.ProgressIndicator;
            DecompilerTypeSystem ts = new DecompilerTypeSystem(module, AssemblyResolver, settings);

            Parallel.ForEach(
                files,
                new ParallelOptions {
                MaxDegreeOfParallelism = this.MaxDegreeOfParallelism,
                CancellationToken      = cancellationToken
            },
                delegate(IGrouping <string, TypeDefinitionHandle> file) {
                using (StreamWriter w = new StreamWriter(Path.Combine(targetDirectory, file.Key))) {
                    try {
                        CSharpDecompiler decompiler  = CreateDecompiler(ts);
                        decompiler.CancellationToken = cancellationToken;
                        var syntaxTree = decompiler.DecompileTypes(file.ToArray());
                        syntaxTree.AcceptVisitor(new CSharpOutputVisitor(w, settings.CSharpFormattingOptions));
                    } catch (Exception innerException) when(!(innerException is OperationCanceledException || innerException is DecompilerException))
                    {
                        throw new DecompilerException(module, $"Error decompiling for '{file.Key}'", innerException);
                    }
                }
                progress?.Report(new DecompilationProgress(total, file.Key));
            });
            return(files.Select(f => Tuple.Create("Compile", f.Key)).Concat(WriteAssemblyInfo(ts, cancellationToken)));
        }
예제 #21
0
            public override void DecompileMethod(MethodDefinition method, ITextOutput output, DecompilationOptions options)
            {
                base.DecompileMethod(method, output, options);
                if (!method.HasBody)
                {
                    return;
                }
                var typeSystem             = new DecompilerTypeSystem(method.Module);
                var specializingTypeSystem = typeSystem.GetSpecializingTypeSystem(new SimpleTypeResolveContext(typeSystem.Resolve(method)));
                var reader = new ILReader(specializingTypeSystem);

                reader.UseDebugSymbols = options.DecompilerSettings.UseDebugSymbols;
                ILFunction         il      = reader.ReadIL(method.Body, options.CancellationToken);
                ILTransformContext context = new ILTransformContext(il, typeSystem, options.DecompilerSettings)
                {
                    CancellationToken = options.CancellationToken
                };

                context.Stepper.StepLimit = options.StepLimit;
                context.Stepper.IsDebug   = options.IsDebug;
                try {
                    il.RunTransforms(transforms, context);
                } catch (StepLimitReachedException) {
                } catch (Exception ex) {
                    output.WriteLine(ex.ToString());
                    output.WriteLine();
                    output.WriteLine("ILAst after the crash:");
                } finally {
                    // update stepper even if a transform crashed unexpectedly
                    if (options.StepLimit == int.MaxValue)
                    {
                        Stepper = context.Stepper;
                        OnStepperUpdated(new EventArgs());
                    }
                }
                (output as ISmartTextOutput)?.AddUIElement(OptionsCheckBox(nameof(writingOptions.UseFieldSugar)));
                output.WriteLine();
                (output as ISmartTextOutput)?.AddUIElement(OptionsCheckBox(nameof(writingOptions.UseLogicOperationSugar)));
                output.WriteLine();
                (output as ISmartTextOutput)?.AddButton(Images.ViewCode, "Show Steps", delegate {
                    DebugSteps.Show();
                });
                output.WriteLine();
                il.WriteTo(output, writingOptions);
            }
예제 #22
0
 /// <summary>
 /// Instianciates a CSharpDecompiler from a given assemblyfilename and applies decompilersettings
 /// </summary>
 /// <param name="assemblyFileName">path for assemblyfile to decompile</param>
 /// <param name="settings">optional decompiler settings</param>
 /// <returns>Instance of CSharpDecompiler</returns>
 public CSharpDecompiler GetCSharpDecompiler(string assemblyFileName, DecompilerSettings settings = null)
 {
     if (settings == null)
     {
         settings = new DecompilerSettings();
     }
     using (var file = new FileStream(assemblyFileName, FileMode.Open, FileAccess.Read))
     {
         var module   = new PEFile(assemblyFileName, file, PEStreamOptions.PrefetchEntireImage);
         var resolver = new UniversalAssemblyResolver(assemblyFileName, false,
                                                      module.Reader.DetectTargetFrameworkId(), PEStreamOptions.PrefetchMetadata);
         resolver.AddSearchDirectory(Path.GetDirectoryName(module.FullName));
         var typeSystem = new DecompilerTypeSystem(module, resolver, settings);
         var decompiler = new CSharpDecompiler(typeSystem, settings);
         decompiler.DebugInfoProvider = DebugInfoLoader.LoadSymbols(module);
         return(decompiler);
     }
 }
예제 #23
0
        public static InterfaceInfo GetInterfaceInfo(DecompilerTypeSystem typeSystem, string typeName)
        {
            var           type = DecompilerUtils.GetSelfDefinedWinmdToplevelTypes(typeSystem).Where(t => t.Kind == TypeKind.Interface && t.Name == typeName).Single();
            InterfaceInfo ret  = new InterfaceInfo()
            {
                Name = type.Name
            };
            List <string> protoTypes = new List <string>();

            foreach (IMethod method in type.Methods)
            {
                protoTypes.Add(GetMethodPrototype(method));
            }

            ret.Methods = protoTypes.ToArray();

            return(ret);
        }
예제 #24
0
파일: Tester.cs 프로젝트: yrest/ILSpy
        public static string DecompileCSharp(string assemblyFileName)
        {
            using (var module = ModuleDefinition.ReadModule(assemblyFileName)) {
                var typeSystem = new DecompilerTypeSystem(module);
                CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, new DecompilerSettings());
                decompiler.AstTransforms.Insert(0, new RemoveCompilerAttribute());
                decompiler.AstTransforms.Add(new EscapeInvalidIdentifiers());
                var syntaxTree = decompiler.DecompileWholeModuleAsSingleFile();

                StringWriter output  = new StringWriter();
                var          visitor = new CSharpOutputVisitor(output, FormattingOptionsFactory.CreateSharpDevelop());
                syntaxTree.AcceptVisitor(visitor);

                string fileName = Path.GetTempFileName();
                File.WriteAllText(fileName, output.ToString());

                return(fileName);
            }
        }
예제 #25
0
        IEnumerable <(string itemType, string fileName)> WriteAssemblyInfo(DecompilerTypeSystem ts, CancellationToken cancellationToken)
        {
            var decompiler = CreateDecompiler(ts);

            decompiler.CancellationToken = cancellationToken;
            decompiler.AstTransforms.Add(new RemoveCompilerGeneratedAssemblyAttributes());
            SyntaxTree syntaxTree = decompiler.DecompileModuleAndAssemblyAttributes();

            const string prop = "Properties";

            if (Settings.ProduceSourceCode)
            {
                if (directories.Add(prop))
                {
                    Directory.CreateDirectory(Path.Combine(TargetDirectory, prop));
                }
            }

            string assemblyInfo = Path.Combine(prop, "AssemblyInfo.cs");

            var checksumCalc = Settings.checksumCalc;

            if (checksumCalc.Enabled)
            {
                var settings = Settings;

                foreach (var node in syntaxTree.Children)
                {
                    AttributeSection asection = node as AttributeSection;
                    if (asection == null)
                    {
                        continue;
                    }

                    foreach (var attr in asection.Attributes)
                    {
                        checksumCalc.AppendString(attr.ToString());
                    }
                }

                if (!Settings.ProduceSourceCode)
                {
                    return(new[] { ("Compile", assemblyInfo) });
예제 #26
0
        ITypeDefinition TryResolve(PEFile module, EntityHandle handle, IType type, bool mayRetry = true)
        {
            DecompilerTypeSystem typeSystem = new DecompilerTypeSystem(module, module.GetAssemblyResolver(),
                                                                       TypeSystemOptions.Default | TypeSystemOptions.Uncached);
            var t = typeSystem.MainModule.ResolveEntity(handle) as ITypeDefinition;

            if (t != null)
            {
                showExpander = t.DirectBaseTypes.Any();
                var other = t.ParentModule.PEFile.GetTypeSystemWithCurrentOptionsOrNull();
                Debug.Assert(other != null);
                t = other.FindType(t.FullTypeName).GetDefinition();
            }
            else
            {
                showExpander = mayRetry;
            }
            RaisePropertyChanged(nameof(Text));
            RaisePropertyChanged(nameof(ShowExpander));
            return(t);
        }
예제 #27
0
 public IEnumerable <ITypeDefinition> GetTypesInScope(CancellationToken ct)
 {
     if (IsLocal)
     {
         foreach (var type in TreeTraversal.PreOrder(typeScope, t => t.NestedTypes))
         {
             yield return(type);
         }
     }
     else
     {
         foreach (var module in GetModulesInScope(ct))
         {
             var typeSystem = new DecompilerTypeSystem(module, module.GetAssemblyResolver());
             foreach (var type in typeSystem.MainModule.TypeDefinitions)
             {
                 yield return(type);
             }
         }
     }
 }
예제 #28
0
 protected IEnumerable <AnalyzerTreeNode> FetchChildren(CancellationToken ct)
 {
     if (symbol is IEntity entity)
     {
         var module  = entity.ParentModule.PEFile;
         var ts      = new DecompilerTypeSystem(module, module.GetAssemblyResolver());
         var context = new AnalyzerContext()
         {
             CancellationToken = ct,
             Language          = Language,
             AssemblyList      = MainWindow.Instance.CurrentAssemblyList
         };
         foreach (var result in analyzer.Analyze(symbol, context))
         {
             yield return(SymbolTreeNodeFactory(result));
         }
     }
     else
     {
         throw new NotSupportedException("Currently symbols that are not entities are not supported!");
     }
 }
예제 #29
0
        static void Decompile(string assemblyFileName, TextWriter output, string typeName = null)
        {
            ModuleDefinition module     = LoadModule(assemblyFileName);
            var typeSystem              = new DecompilerTypeSystem(module);
            CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, new DecompilerSettings());

            decompiler.AstTransforms.Add(new EscapeInvalidIdentifiers());
            SyntaxTree syntaxTree;

            if (typeName == null)
            {
                syntaxTree = decompiler.DecompileWholeModuleAsSingleFile();
            }
            else
            {
                syntaxTree = decompiler.DecompileTypes(module.GetTypes().Where(td => string.Equals(td.FullName, typeName, StringComparison.OrdinalIgnoreCase)));
            }

            var visitor = new CSharpOutputVisitor(output, FormattingOptionsFactory.CreateSharpDevelop());

            syntaxTree.AcceptVisitor(visitor);
        }
예제 #30
0
 object GenerateTooltip(ReferenceSegment segment)
 {
     if (segment.Reference is ICSharpCode.Decompiler.Disassembler.OpCodeInfo code)
     {
         XmlDocumentationProvider docProvider = XmlDocLoader.MscorlibDocumentation;
         if (docProvider != null)
         {
             string documentation = docProvider.GetDocumentation("F:System.Reflection.Emit.OpCodes." + code.EncodedName);
             if (documentation != null)
             {
                 XmlDocRenderer renderer = new XmlDocRenderer();
                 renderer.AppendText($"{code.Name} (0x{code.Code:x}) - ");
                 renderer.AddXmlDocumentation(documentation);
                 return(renderer.CreateTextBlock());
             }
         }
         return($"{code.Name} (0x{code.Code:x})");
     }
     else if (segment.Reference is IEntity entity)
     {
         return(CreateTextBlockForEntity(entity));
     }
     else if (segment.Reference is ValueTuple <PEFile, System.Reflection.Metadata.EntityHandle> unresolvedEntity)
     {
         var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Item1, unresolvedEntity.Item1.GetAssemblyResolver(), TypeSystemOptions.Default | TypeSystemOptions.Uncached);
         try {
             IEntity resolved = typeSystem.MainModule.ResolveEntity(unresolvedEntity.Item2);
             if (resolved == null)
             {
                 return(null);
             }
             return(CreateTextBlockForEntity(resolved));
         } catch (BadImageFormatException) {
             return(null);
         }
     }
     return(null);
 }