コード例 #1
0
		public void DecompileOnDemand(TypeDefinition type)
		{
			if (type == null)
				return;
			
			if (CheckMappings(type.MetadataToken.ToInt32()))
				return;
			
			try {
				DecompilerContext context = new DecompilerContext(type.Module);
				AstBuilder astBuilder = new AstBuilder(context);
				astBuilder.AddType(type);
				astBuilder.GenerateCode(new PlainTextOutput());
				
				int token = type.MetadataToken.ToInt32();
				var info = new DecompileInformation {
					CodeMappings = astBuilder.CodeMappings,
					LocalVariables = astBuilder.LocalVariables,
					DecompiledMemberReferences = astBuilder.DecompiledMemberReferences
				};
				
				// save the data
				DebugInformation.AddOrUpdate(token, info, (k, v) => info);
			} catch {
				return;
			}
		}
コード例 #2
0
		void RunDecompiler(string assemblyFile, string fullTypeName, ITextOutput textOutput, CancellationToken cancellationToken)
		{
			ReaderParameters readerParameters = new ReaderParameters();
			// Use new assembly resolver instance so that the AssemblyDefinitions can be garbage-collected
			// once the code is decompiled.
			readerParameters.AssemblyResolver = new ILSpyAssemblyResolver(Path.GetDirectoryName(assemblyFile));
			
			ModuleDefinition module = ModuleDefinition.ReadModule(assemblyFile, readerParameters);
			TypeDefinition typeDefinition = module.GetType(fullTypeName);
			if (typeDefinition == null)
				throw new InvalidOperationException("Could not find type");
			DecompilerContext context = new DecompilerContext(module);
			context.CancellationToken = cancellationToken;
			AstBuilder astBuilder = new AstBuilder(context);
			astBuilder.AddType(typeDefinition);
			astBuilder.GenerateCode(textOutput);
			
			// save decompilation data
			decompiledType = typeDefinition;
			
			int token = decompiledType.MetadataToken.ToInt32();
			var info = new DecompileInformation {
				CodeMappings = astBuilder.CodeMappings,
				LocalVariables = astBuilder.LocalVariables,
				DecompiledMemberReferences = astBuilder.DecompiledMemberReferences
			};
			
			// save the data
			DebuggerDecompilerService.DebugInformation.AddOrUpdate(token, info, (k, v) => info);
		}
コード例 #3
0
		void RunDecompiler(string assemblyFile, string fullTypeName, ITextOutput textOutput, CancellationToken cancellationToken)
		{
			ReaderParameters readerParameters = new ReaderParameters();
			// Use new assembly resolver instance so that the AssemblyDefinitions can be garbage-collected
			// once the code is decompiled.
			readerParameters.AssemblyResolver = new DefaultAssemblyResolver();
			
			ModuleDefinition module = ModuleDefinition.ReadModule(assemblyFile, readerParameters);
			TypeDefinition typeDefinition = module.GetType(fullTypeName);
			if (typeDefinition == null)
				throw new InvalidOperationException("Could not find type");
			DecompilerContext context = new DecompilerContext(module);
			context.CancellationToken = cancellationToken;
			AstBuilder astBuilder = new AstBuilder(context);
			astBuilder.AddType(typeDefinition);
			astBuilder.GenerateCode(textOutput);
			
			// save decompilation data
			var nodes = TreeTraversal
				.PreOrder((AstNode)astBuilder.CompilationUnit, n => n.Children)
				.Where(n => n is AttributedNode && n.Annotation<Tuple<int, int>>() != null);
			MemberReference = typeDefinition;
			
			int token = MemberReference.MetadataToken.ToInt32();
			var info = new DecompileInformation {
				CodeMappings = astBuilder.CodeMappings,
				LocalVariables = astBuilder.LocalVariables,
				DecompiledMemberReferences = astBuilder.DecompiledMemberReferences,
				AstNodes = nodes
			};
			
			// save the data
			DebuggerDecompilerService.DebugInformation.AddOrUpdate(token, info, (k, v) => info);
		}