예제 #1
0
파일: Commands.cs 프로젝트: xornand/dnSpy
        protected override void Execute(LocalsCtxMenuContext context)
        {
            var output = new PlainTextOutput();

            foreach (var vm in context.SelectedItems)
            {
                //TODO: Break if it takes too long and the user cancels
                var printer = new ValuePrinter(output, DebuggerSettings.Instance.UseHexadecimal);
                printer.WriteExpander(vm);
                output.Write('\t', TextTokenType.Text);
                // Add an extra here to emulate VS output
                output.Write('\t', TextTokenType.Text);
                printer.WriteName(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteValue(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteType(vm);
                output.WriteLine();
            }
            var s = output.ToString();

            if (s.Length > 0)
            {
                Clipboard.SetText(s);
            }
        }
 private static void WriteTo(this FieldReference field, PlainTextOutput writer)
 {
     field.FieldType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters);
     writer.Write(' ');
     field.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName);
     writer.Write("::");
     writer.Write(Escape(field.Name));
 }
예제 #3
0
        public string Decompile(object @object)
        {
            if (@object == null)
            {
                return(String.Empty);
            }
            Language l = new CSharpLanguage();

            //ITextOutput output = new RtfTextOutput();
            ITextOutput output  = new PlainTextOutput();
            var         options = new DecompilationOptions();

            if (@object is AssemblyDefinition)
            {
                l.DecompileAssembly((AssemblyDefinition)@object, output, options);
            }
            else if (@object is TypeDefinition)
            {
                l.DecompileType((TypeDefinition)@object, output, options);
            }
            else if (@object is MethodDefinition)
            {
                l.DecompileMethod((MethodDefinition)@object, output, options);
            }
            else if (@object is FieldDefinition)
            {
                l.DecompileField((FieldDefinition)@object, output, options);
            }
            else if (@object is PropertyDefinition)
            {
                l.DecompileProperty((PropertyDefinition)@object, output, options);
            }
            else if (@object is EventDefinition)
            {
                l.DecompileEvent((EventDefinition)@object, output, options);
            }
            else if (@object is AssemblyNameReference)
            {
                output.Write("// Assembly Reference ");
                output.WriteDefinition(@object.ToString(), null);
                output.WriteLine();
            }
            else if (@object is ModuleReference)
            {
                output.Write("// Module Reference ");
                output.WriteDefinition(@object.ToString(), null);
                output.WriteLine();
            }
            else
            {
                output.Write(String.Format("// {0} ", @object.GetType().Name));
                output.WriteDefinition(@object.ToString(), null);
                output.WriteLine();
            }

            return(output.ToString());
        }
		private static void WriteLabelList(PlainTextOutput writer, Instruction[] instructions)
		{
			writer.Write("(");
			for (var i = 0; i < instructions.Length; i++)
			{
				if (i != 0) writer.Write(", ");
				WriteOffsetReference(writer, instructions[i]);
			}
			writer.Write(")");
		}
 private static void WriteLabelList(PlainTextOutput writer, Instruction[] instructions)
 {
     writer.Write("(");
     for (var i = 0; i < instructions.Length; i++)
     {
         if (i != 0)
         {
             writer.Write(", ");
         }
         WriteOffsetReference(writer, instructions[i]);
     }
     writer.Write(")");
 }
예제 #6
0
        protected override void CopyItemsAsText(LocalVM[] locals)
        {
            Array.Sort(locals, (a, b) => a.Index.CompareTo(b.Index));

            var output = new PlainTextOutput();

            for (int i = 0; i < locals.Length; i++)
            {
                if (i > 0)
                {
                    output.WriteLine();
                }

                var local = locals[i];
                output.Write(local.Index.ToString(), TextTokenType.Number);
                output.Write('\t', TextTokenType.Text);
                output.Write(local.IsPinned ? "P" : string.Empty, TextTokenType.Text);
                output.Write('\t', TextTokenType.Text);
                output.Write(local.IsCompilerGenerated ? "C" : string.Empty, TextTokenType.Text);
                output.Write('\t', TextTokenType.Text);
                output.Write(local.Name ?? string.Empty, TextTokenType.Local);
                output.Write('\t', TextTokenType.Text);
                BodyUtils.WriteObject(output, local.Type);
            }
            if (locals.Length > 1)
            {
                output.WriteLine();
            }

            Clipboard.SetText(output.ToString());
        }
예제 #7
0
        public override string ToString()
        {
            var output = new PlainTextOutput();

            WriteTo(output, new ILAstWritingOptions());
            if (!ILRange.IsEmpty)
            {
                output.Write(" at IL_" + ILRange.Start.ToString("x4"));
            }
            return(output.ToString());
        }
        public static void WriteTo(this Instruction instruction, PlainTextOutput writer)
        {
            writer.Write($"IL_{instruction.Offset:x4}");
            writer.Write(": ");
            writer.Write(instruction.OpCode.Name);

            if (instruction.Operand == null)
            {
                return;
            }

            writer.Write(' ');
            if (instruction.OpCode == OpCodes.Ldtoken)
            {
                if (instruction.Operand is MethodReference)
                {
                    writer.Write("method ");
                }
                else if (instruction.Operand is FieldReference)
                {
                    writer.Write("field ");
                }
            }
            WriteOperand(writer, instruction.Operand);
        }
예제 #9
0
        protected override void Execute(BreakpointCtxMenuContext context)
        {
            var output = new PlainTextOutput();

            foreach (var vm in context.SelectedItems)
            {
                var printer = new BreakpointPrinter(output, DebuggerSettings.Instance.UseHexadecimal);
                printer.WriteName(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteAssembly(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteModule(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteFile(vm);
                output.WriteLine();
            }
            var s = output.ToString();

            if (s.Length > 0)
            {
                Clipboard.SetText(s);
            }
        }
예제 #10
0
        protected override void Execute(ModulesCtxMenuContext context)
        {
            var output = new PlainTextOutput();

            foreach (var vm in context.SelectedItems)
            {
                var printer = new ModulePrinter(output, DebuggerSettings.Instance.UseHexadecimal);
                printer.WriteName(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteOptimized(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteDynamic(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteInMemory(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteOrder(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteVersion(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteTimestamp(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteAddress(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteProcess(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteAppDomain(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WritePath(vm);
                output.WriteLine();
            }
            var s = output.ToString();

            if (s.Length > 0)
            {
                Clipboard.SetText(s);
            }
        }
예제 #11
0
        protected override void CopyItemsAsText(ExceptionHandlerVM[] ehs)
        {
            Array.Sort(ehs, (a, b) => a.Index.CompareTo(b.Index));

            var output = new PlainTextOutput();

            for (int i = 0; i < ehs.Length; i++)
            {
                if (i > 0)
                {
                    output.WriteLine();
                }

                var eh = ehs[i];
                output.Write(eh.Index.ToString(), TextTokenType.Number);
                output.Write('\t', TextTokenType.Text);
                BodyUtils.WriteObject(output, eh.TryStartVM.SelectedItem);
                output.Write('\t', TextTokenType.Text);
                BodyUtils.WriteObject(output, eh.TryEndVM.SelectedItem);
                output.Write('\t', TextTokenType.Text);
                BodyUtils.WriteObject(output, eh.FilterStartVM.SelectedItem);
                output.Write('\t', TextTokenType.Text);
                BodyUtils.WriteObject(output, eh.HandlerStartVM.SelectedItem);
                output.Write('\t', TextTokenType.Text);
                BodyUtils.WriteObject(output, eh.HandlerEndVM.SelectedItem);
                output.Write('\t', TextTokenType.Text);
                output.Write(((EnumVM)eh.HandlerTypeVM.Items[eh.HandlerTypeVM.SelectedIndex]).Name, TextTokenType.Text);
                output.Write('\t', TextTokenType.Text);
                BodyUtils.WriteObject(output, eh.CatchType);
            }
            if (ehs.Length > 1)
            {
                output.WriteLine();
            }

            Clipboard.SetText(output.ToString());
        }
		public static void WriteTo(this Instruction instruction, PlainTextOutput writer)
		{
			writer.Write($"IL_{instruction.Offset:x4}");
			writer.Write(": ");
			writer.Write(instruction.OpCode.Name);

			if (instruction.Operand == null)
				return;

			writer.Write(' ');
			if (instruction.OpCode == OpCodes.Ldtoken)
			{
				if (instruction.Operand is MethodReference)
					writer.Write("method ");
				else if (instruction.Operand is FieldReference)
					writer.Write("field ");
			}
			WriteOperand(writer, instruction.Operand);
		}
예제 #13
0
        public static void WriteTo(this TypeReference type, PlainTextOutput writer, IlNameSyntax syntax = IlNameSyntax.Signature)
        {
            var syntaxForElementTypes = syntax == IlNameSyntax.SignatureNoNamedTypeParameters ? syntax : IlNameSyntax.Signature;

            if (type is PinnedType)
            {
                ((PinnedType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
                writer.Write(" pinned");
            }
            else if (type is ArrayType)
            {
                var at = (ArrayType)type;
                at.ElementType.WriteTo(writer, syntaxForElementTypes);
                writer.Write('[');
                writer.Write(string.Join(", ", at.Dimensions));
                writer.Write(']');
            }
            else if (type is GenericParameter)
            {
                writer.Write('!');
                if (((GenericParameter)type).Owner.GenericParameterType == GenericParameterType.Method)
                {
                    writer.Write('!');
                }
                if (string.IsNullOrEmpty(type.Name) || type.Name[0] == '!' || syntax == IlNameSyntax.SignatureNoNamedTypeParameters)
                {
                    writer.Write(((GenericParameter)type).Position.ToString());
                }
                else
                {
                    writer.Write(Escape(type.Name));
                }
            }
            else if (type is ByReferenceType)
            {
                ((ByReferenceType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
                writer.Write('&');
            }
            else if (type is PointerType)
            {
                ((PointerType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
                writer.Write('*');
            }
            else if (type is GenericInstanceType)
            {
                type.GetElementType().WriteTo(writer, syntaxForElementTypes);
                writer.Write('<');
                var arguments = ((GenericInstanceType)type).GenericArguments;
                for (var i = 0; i < arguments.Count; i++)
                {
                    if (i > 0)
                    {
                        writer.Write(", ");
                    }
                    arguments[i].WriteTo(writer, syntaxForElementTypes);
                }
                writer.Write('>');
            }
            else if (type is OptionalModifierType)
            {
                ((OptionalModifierType)type).ElementType.WriteTo(writer, syntax);
                writer.Write(" modopt(");
                ((OptionalModifierType)type).ModifierType.WriteTo(writer, IlNameSyntax.TypeName);
                writer.Write(") ");
            }
            else if (type is RequiredModifierType)
            {
                ((RequiredModifierType)type).ElementType.WriteTo(writer, syntax);
                writer.Write(" modreq(");
                ((RequiredModifierType)type).ModifierType.WriteTo(writer, IlNameSyntax.TypeName);
                writer.Write(") ");
            }
            else
            {
                var name = PrimitiveTypeName(type.FullName);
                if ((syntax == IlNameSyntax.Signature || syntax == IlNameSyntax.SignatureNoNamedTypeParameters) && name != null)
                {
                    writer.Write(name);
                }
                else
                {
                    if (syntax == IlNameSyntax.Signature || syntax == IlNameSyntax.SignatureNoNamedTypeParameters)
                    {
                        writer.Write(type.IsValueType ? "valuetype " : "class ");
                    }
                    if (type.DeclaringType != null)
                    {
                        type.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName);
                        writer.Write('/');
                        writer.Write(Escape(type.Name));
                    }
                    else
                    {
                        if (!type.IsDefinition && type.Scope != null && !(type is TypeSpecification))
                        {
                            writer.Write("[{0}]", Escape(type.Scope.Name));
                        }
                        writer.Write(Escape(type.FullName));
                    }
                }
            }
        }
예제 #14
0
        public void Disassemble(MethodBody body)
        {
            // start writing IL code
            var method       = body.Method;
            var codesize     = body.ComputeCodeSize();
            var maxstacksize = body.ComputeMaxStackSize();

            body.ComputeOffsets();

            _o.WriteLine("// Code size {0} (0x{0:x})", codesize);
            _o.WriteLine(".maxstack {0}", maxstacksize);
            if (method.DeclaringType.Module.Assembly != null && method.DeclaringType.Module.Assembly.EntryPoint == method)
            {
                _o.WriteLine(".entrypoint");
            }

            if (method.Body.HasVariables)
            {
                _o.Write(".locals ");
                if (body.InitLocals)
                {
                    _o.Write("init ");
                }
                _o.WriteLine("(");
                _o.Indent();
                foreach (var v in body.Variables)
                {
                    _o.Write("[" + v.Index + "] ");
                    v.VariableType.WriteTo(_o);
                    if (!string.IsNullOrEmpty(v.Name))
                    {
                        _o.Write(' ');
                        _o.Write(DisassemblerHelpers.Escape(v.Name));
                    }
                    if (v.Index + 1 < body.Variables.Count)
                    {
                        _o.Write(',');
                    }
                    _o.WriteLine();
                }
                _o.Unindent();
                _o.WriteLine(")");
            }
            _o.WriteLine();

            if (body.Instructions.Count > 0)
            {
                var inst          = body.Instructions[0];
                var branchTargets = GetBranchTargets(body.Instructions);
                WriteStructureBody(new IlStructure(body, codesize), branchTargets, ref inst);
            }
            else
            {
                // we ignore method without instructions (but it can have exception handlers)
                _o.WriteLine();
            }
        }
예제 #15
0
        public static void WriteOperand(PlainTextOutput writer, object operand)
        {
            if (operand == null)
            {
                throw new ArgumentNullException(nameof(operand));
            }
            var targetInstruction = operand as Instruction;

            if (targetInstruction != null)
            {
                WriteOffsetReference(writer, targetInstruction);
                return;
            }
            var targetInstructions = operand as Instruction[];

            if (targetInstructions != null)
            {
                WriteLabelList(writer, targetInstructions);
                return;
            }
            var variableRef = operand as VariableReference;

            if (variableRef != null)
            {
                writer.Write(string.IsNullOrEmpty(variableRef.Name) ? variableRef.Index.ToString() : Escape(variableRef.Name));
                return;
            }
            var paramRef = operand as ParameterReference;

            if (paramRef != null)
            {
                writer.Write(string.IsNullOrEmpty(paramRef.Name) ? paramRef.Index.ToString() : Escape(paramRef.Name));
                return;
            }
            var methodRef = operand as MethodReference;

            if (methodRef != null)
            {
                methodRef.WriteTo(writer);
                return;
            }
            var typeRef = operand as TypeReference;

            if (typeRef != null)
            {
                typeRef.WriteTo(writer, IlNameSyntax.TypeName);
                return;
            }
            var fieldRef = operand as FieldReference;

            if (fieldRef != null)
            {
                fieldRef.WriteTo(writer);
                return;
            }
            var s = operand as string;

            if (s != null)
            {
                writer.Write("\"" + ConvertString(s) + "\"");
            }
            else if (operand is char)
            {
                writer.Write(((int)(char)operand).ToString());
            }
            else if (operand is float)
            {
                var val = (float)operand;
                if (val == 0)
                {
                    if (float.IsNegativeInfinity(1 / val))
                    {
                        // negative zero is a special case
                        writer.Write('-');
                    }
                    writer.Write("0.0");
                }
                else if (float.IsInfinity(val) || float.IsNaN(val))
                {
                    var data = BitConverter.GetBytes(val);
                    writer.Write('(');
                    for (var i = 0; i < data.Length; i++)
                    {
                        if (i > 0)
                        {
                            writer.Write(' ');
                        }
                        writer.Write(data[i].ToString("X2"));
                    }
                    writer.Write(')');
                }
                else
                {
                    writer.Write(val.ToString("R", System.Globalization.CultureInfo.InvariantCulture));
                }
            }
            else if (operand is double)
            {
                var val = (double)operand;
                if (val == 0)
                {
                    if (double.IsNegativeInfinity(1 / val))
                    {
                        // negative zero is a special case
                        writer.Write('-');
                    }
                    writer.Write("0.0");
                }
                else if (double.IsInfinity(val) || double.IsNaN(val))
                {
                    var data = BitConverter.GetBytes(val);
                    writer.Write('(');
                    for (var i = 0; i < data.Length; i++)
                    {
                        if (i > 0)
                        {
                            writer.Write(' ');
                        }
                        writer.Write(data[i].ToString("X2"));
                    }
                    writer.Write(')');
                }
                else
                {
                    writer.Write(val.ToString("R", System.Globalization.CultureInfo.InvariantCulture));
                }
            }
            else if (operand is bool)
            {
                writer.Write((bool)operand ? "true" : "false");
            }
            else
            {
                s = ToInvariantCultureString(operand);
                writer.Write(s);
            }
        }
예제 #16
0
        public static void CopyItemsAsTextToClipboard(InstructionVM[] instrs)
        {
            var output = new PlainTextOutput();

            for (int i = 0; i < instrs.Length; i++)
            {
                if (i > 0)
                {
                    output.WriteLine();
                }

                var instr = instrs[i];
                output.Write(instr.Index.ToString(), TextTokenType.Number);
                output.Write('\t', TextTokenType.Text);
                output.Write(string.Format("{0:X4}", instr.Offset), TextTokenType.Label);
                output.Write('\t', TextTokenType.Text);
                output.Write(instr.Code.ToOpCode().ToString(), TextTokenType.OpCode);

                switch (instr.InstructionOperandVM.InstructionOperandType)
                {
                case InstructionOperandType.None:
                    break;

                case InstructionOperandType.SByte:
                    output.Write('\t', TextTokenType.Text);
                    output.Write(instr.InstructionOperandVM.SByte.StringValue, TextTokenType.Number);
                    break;

                case InstructionOperandType.Byte:
                    output.Write('\t', TextTokenType.Text);
                    output.Write(instr.InstructionOperandVM.Byte.StringValue, TextTokenType.Number);
                    break;

                case InstructionOperandType.Int32:
                    output.Write('\t', TextTokenType.Text);
                    output.Write(instr.InstructionOperandVM.Int32.StringValue, TextTokenType.Number);
                    break;

                case InstructionOperandType.Int64:
                    output.Write('\t', TextTokenType.Text);
                    output.Write(instr.InstructionOperandVM.Int64.StringValue, TextTokenType.Number);
                    break;

                case InstructionOperandType.Single:
                    output.Write('\t', TextTokenType.Text);
                    output.Write(instr.InstructionOperandVM.Single.StringValue, TextTokenType.Number);
                    break;

                case InstructionOperandType.Double:
                    output.Write('\t', TextTokenType.Text);
                    output.Write(instr.InstructionOperandVM.Double.StringValue, TextTokenType.Number);
                    break;

                case InstructionOperandType.String:
                    output.Write('\t', TextTokenType.Text);
                    output.Write(instr.InstructionOperandVM.String.StringValue, TextTokenType.String);
                    break;

                case InstructionOperandType.Field:
                case InstructionOperandType.Method:
                case InstructionOperandType.Token:
                case InstructionOperandType.Type:
                case InstructionOperandType.MethodSig:
                case InstructionOperandType.BranchTarget:
                case InstructionOperandType.SwitchTargets:
                case InstructionOperandType.Local:
                case InstructionOperandType.Parameter:
                    output.Write('\t', TextTokenType.Text);
                    BodyUtils.WriteObject(output, instr.InstructionOperandVM.Value);
                    break;

                default: throw new InvalidOperationException();
                }
            }
            if (instrs.Length > 1)
            {
                output.WriteLine();
            }

            Clipboard.SetText(output.ToString());
        }
		private static void WriteTo(this FieldReference field, PlainTextOutput writer)
		{
			field.FieldType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters);
			writer.Write(' ');
			field.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName);
			writer.Write("::");
			writer.Write(Escape(field.Name));
		}
예제 #18
0
 public static void WriteOffsetReference(PlainTextOutput writer, Instruction instruction)
 {
     writer.Write($"IL_{instruction.Offset:x4}");
 }
		public static void WriteOperand(PlainTextOutput writer, object operand)
		{
			if (operand == null)
				throw new ArgumentNullException(nameof(operand));
			var targetInstruction = operand as Instruction;
			if (targetInstruction != null)
			{
				WriteOffsetReference(writer, targetInstruction);
				return;
			}
			var targetInstructions = operand as Instruction[];
			if (targetInstructions != null)
			{
				WriteLabelList(writer, targetInstructions);
				return;
			}
			var variableRef = operand as VariableReference;
			if (variableRef != null)
			{
			    writer.Write(string.IsNullOrEmpty(variableRef.Name) ? variableRef.Index.ToString() : Escape(variableRef.Name));
			    return;
			}
			var paramRef = operand as ParameterReference;
			if (paramRef != null)
			{
			    writer.Write(string.IsNullOrEmpty(paramRef.Name) ? paramRef.Index.ToString() : Escape(paramRef.Name));
			    return;
			}
			var methodRef = operand as MethodReference;
			if (methodRef != null)
			{
				methodRef.WriteTo(writer);
				return;
			}
			var typeRef = operand as TypeReference;
			if (typeRef != null)
			{
				typeRef.WriteTo(writer, IlNameSyntax.TypeName);
				return;
			}
			var fieldRef = operand as FieldReference;
			if (fieldRef != null)
			{
				fieldRef.WriteTo(writer);
				return;
			}
			var s = operand as string;
			if (s != null)
			{
				writer.Write("\"" + ConvertString(s) + "\"");
			}
			else if (operand is char)
			{
				writer.Write(((int)(char)operand).ToString());
			}
			else if (operand is float)
			{
				var val = (float)operand;
				if (val == 0)
				{
					if (float.IsNegativeInfinity(1 / val))
						// negative zero is a special case
						writer.Write('-');
					writer.Write("0.0");
				}
				else if (float.IsInfinity(val) || float.IsNaN(val))
				{
					var data = BitConverter.GetBytes(val);
					writer.Write('(');
					for (var i = 0; i < data.Length; i++)
					{
						if (i > 0)
							writer.Write(' ');
						writer.Write(data[i].ToString("X2"));
					}
					writer.Write(')');
				}
				else
				{
					writer.Write(val.ToString("R", System.Globalization.CultureInfo.InvariantCulture));
				}
			}
			else if (operand is double)
			{
				var val = (double)operand;
				if (val == 0)
				{
					if (double.IsNegativeInfinity(1 / val))
						// negative zero is a special case
						writer.Write('-');
					writer.Write("0.0");
				}
				else if (double.IsInfinity(val) || double.IsNaN(val))
				{
					var data = BitConverter.GetBytes(val);
					writer.Write('(');
					for (var i = 0; i < data.Length; i++)
					{
						if (i > 0)
							writer.Write(' ');
						writer.Write(data[i].ToString("X2"));
					}
					writer.Write(')');
				}
				else
				{
					writer.Write(val.ToString("R", System.Globalization.CultureInfo.InvariantCulture));
				}
			}
			else if (operand is bool)
			{
				writer.Write((bool)operand ? "true" : "false");
			}
			else
			{
				s = ToInvariantCultureString(operand);
				writer.Write(s);
			}
		}
		public static void WriteTo(this TypeReference type, PlainTextOutput writer, IlNameSyntax syntax = IlNameSyntax.Signature)
		{
			var syntaxForElementTypes = syntax == IlNameSyntax.SignatureNoNamedTypeParameters ? syntax : IlNameSyntax.Signature;
			if (type is PinnedType)
			{
				((PinnedType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
				writer.Write(" pinned");
			}
			else if (type is ArrayType)
			{
				var at = (ArrayType)type;
				at.ElementType.WriteTo(writer, syntaxForElementTypes);
				writer.Write('[');
				writer.Write(string.Join(", ", at.Dimensions));
				writer.Write(']');
			}
			else if (type is GenericParameter)
			{
				writer.Write('!');
				if (((GenericParameter)type).Owner.GenericParameterType == GenericParameterType.Method)
					writer.Write('!');
				if (string.IsNullOrEmpty(type.Name) || type.Name[0] == '!' || syntax == IlNameSyntax.SignatureNoNamedTypeParameters)
					writer.Write(((GenericParameter)type).Position.ToString());
				else
					writer.Write(Escape(type.Name));
			}
			else if (type is ByReferenceType)
			{
				((ByReferenceType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
				writer.Write('&');
			}
			else if (type is PointerType)
			{
				((PointerType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
				writer.Write('*');
			}
			else if (type is GenericInstanceType)
			{
				type.GetElementType().WriteTo(writer, syntaxForElementTypes);
				writer.Write('<');
				var arguments = ((GenericInstanceType)type).GenericArguments;
				for (var i = 0; i < arguments.Count; i++)
				{
					if (i > 0)
						writer.Write(", ");
					arguments[i].WriteTo(writer, syntaxForElementTypes);
				}
				writer.Write('>');
			}
			else if (type is OptionalModifierType)
			{
				((OptionalModifierType)type).ElementType.WriteTo(writer, syntax);
				writer.Write(" modopt(");
				((OptionalModifierType)type).ModifierType.WriteTo(writer, IlNameSyntax.TypeName);
				writer.Write(") ");
			}
			else if (type is RequiredModifierType)
			{
				((RequiredModifierType)type).ElementType.WriteTo(writer, syntax);
				writer.Write(" modreq(");
				((RequiredModifierType)type).ModifierType.WriteTo(writer, IlNameSyntax.TypeName);
				writer.Write(") ");
			}
			else
			{
				var name = PrimitiveTypeName(type.FullName);
				if ((syntax == IlNameSyntax.Signature || syntax == IlNameSyntax.SignatureNoNamedTypeParameters) && name != null)
				{
					writer.Write(name);
				}
				else
				{
					if (syntax == IlNameSyntax.Signature || syntax == IlNameSyntax.SignatureNoNamedTypeParameters)
						writer.Write(type.IsValueType ? "valuetype " : "class ");
					if (type.DeclaringType != null)
					{
						type.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName);
						writer.Write('/');
						writer.Write(Escape(type.Name));
					}
					else
					{
						if (!type.IsDefinition && type.Scope != null && !(type is TypeSpecification))
							writer.Write("[{0}]", Escape(type.Scope.Name));
						writer.Write(Escape(type.FullName));
					}
				}
			}
		}
예제 #21
0
        protected override void Execute(ThreadsCtxMenuContext context)
        {
            var output = new PlainTextOutput();

            foreach (var vm in context.SelectedItems)
            {
                var printer = new ThreadPrinter(output, DebuggerSettings.Instance.UseHexadecimal);
                printer.WriteCurrent(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteId(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteManagedId(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteCategory(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteName(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteLocation(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WritePriority(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteAffinityMask(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteSuspended(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteProcess(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteAppDomain(vm);
                output.Write('\t', TextTokenType.Text);
                printer.WriteUserState(vm);
                output.WriteLine();
            }
            var s = output.ToString();

            if (s.Length > 0)
            {
                Clipboard.SetText(s);
            }
        }
예제 #22
0
        private static void WriteTypeParameters(PlainTextOutput output, IGenericParameterProvider p)
        {
            if (!p.HasGenericParameters)
            {
                return;
            }

            output.Write('<');
            for (var i = 0; i < p.GenericParameters.Count; i++)
            {
                if (i > 0)
                {
                    output.Write(", ");
                }
                var gp = p.GenericParameters[i];
                if (gp.HasReferenceTypeConstraint)
                {
                    output.Write("class ");
                }
                else if (gp.HasNotNullableValueTypeConstraint)
                {
                    output.Write("valuetype ");
                }
                if (gp.HasDefaultConstructorConstraint)
                {
                    output.Write(".ctor ");
                }
                if (gp.HasConstraints)
                {
                    output.Write('(');
                    for (var j = 0; j < gp.Constraints.Count; j++)
                    {
                        if (j > 0)
                        {
                            output.Write(", ");
                        }
                        gp.Constraints[j].WriteTo(output, IlNameSyntax.TypeName);
                    }
                    output.Write(") ");
                }
                if (gp.IsContravariant)
                {
                    output.Write('-');
                }
                else if (gp.IsCovariant)
                {
                    output.Write('+');
                }
                output.Write(DisassemblerHelpers.Escape(gp.Name));
            }
            output.Write('>');
        }
		public static void WriteTo(this MethodReference method, PlainTextOutput writer)
		{
			if (method.ExplicitThis)
				writer.Write("instance explicit ");
			else if (method.HasThis)
				writer.Write("instance ");
			method.ReturnType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters);
			writer.Write(' ');
			if (method.DeclaringType != null)
			{
				method.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName);
				writer.Write("::");
			}
			var md = method as MethodDefinition;
			if (md != null && md.IsCompilerControlled)
			{
				writer.Write(Escape(method.Name + "$PST" + method.MetadataToken.ToInt32().ToString("X8")));
			}
			else
			{
				writer.Write(Escape(method.Name));
			}
			var gim = method as GenericInstanceMethod;
			if (gim != null)
			{
				writer.Write('<');
				for (var i = 0; i < gim.GenericArguments.Count; i++)
				{
					if (i > 0)
						writer.Write(", ");
					gim.GenericArguments[i].WriteTo(writer);
				}
				writer.Write('>');
			}
			writer.Write("(");
			var parameters = method.Parameters;
			for (var i = 0; i < parameters.Count; ++i)
			{
				if (i > 0) writer.Write(", ");
				parameters[i].ParameterType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters);
			}
			writer.Write(")");
		}
		public static void WriteOffsetReference(PlainTextOutput writer, Instruction instruction)
		{
			writer.Write($"IL_{instruction.Offset:x4}");
		}
예제 #25
0
        public static void WriteTo(this MethodReference method, PlainTextOutput writer)
        {
            if (method.ExplicitThis)
            {
                writer.Write("instance explicit ");
            }
            else if (method.HasThis)
            {
                writer.Write("instance ");
            }
            method.ReturnType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters);
            writer.Write(' ');
            if (method.DeclaringType != null)
            {
                method.DeclaringType.WriteTo(writer, IlNameSyntax.TypeName);
                writer.Write("::");
            }
            var md = method as MethodDefinition;

            if (md != null && md.IsCompilerControlled)
            {
                writer.Write(Escape(method.Name + "$PST" + method.MetadataToken.ToInt32().ToString("X8")));
            }
            else
            {
                writer.Write(Escape(method.Name));
            }
            var gim = method as GenericInstanceMethod;

            if (gim != null)
            {
                writer.Write('<');
                for (var i = 0; i < gim.GenericArguments.Count; i++)
                {
                    if (i > 0)
                    {
                        writer.Write(", ");
                    }
                    gim.GenericArguments[i].WriteTo(writer);
                }
                writer.Write('>');
            }
            writer.Write("(");
            var parameters = method.Parameters;

            for (var i = 0; i < parameters.Count; ++i)
            {
                if (i > 0)
                {
                    writer.Write(", ");
                }
                parameters[i].ParameterType.WriteTo(writer, IlNameSyntax.SignatureNoNamedTypeParameters);
            }
            writer.Write(")");
        }