From 1b5ca90f6e8ada7108cd76e998370e42d4e47cb5 Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Wed, 11 Sep 2013 17:43:39 +0200 Subject: Added support for more flags in assembly reference. --- Disassembler.cs | 34 +++++++++++++++++++++++++++++++--- IKVM.Reflection.dll | Bin 442368 -> 446464 bytes 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Disassembler.cs b/Disassembler.cs index 063e294..56c9778 100644 --- a/Disassembler.cs +++ b/Disassembler.cs @@ -2029,9 +2029,37 @@ namespace Ildasm for (int i = 0; i < referencedAssemblies.Length; i++) { AssemblyName asm = referencedAssemblies[i]; - lw.Write(".assembly extern {0}{1}", - asm.ContentType == AssemblyContentType.WindowsRuntime && (compat == CompatLevel.None || compat >= CompatLevel.V45) ? "windowsruntime " : "", - QuoteIdentifier(asm.Name)); + lw.Write(".assembly extern "); + if ((asm.Flags & AssemblyNameFlags.Retargetable) != 0) + { + lw.Write("retargetable "); + } + if (asm.ContentType == AssemblyContentType.WindowsRuntime && (compat == CompatLevel.None || compat >= CompatLevel.V45)) + { + lw.Write("windowsruntime "); + } + switch (asm.ProcessorArchitecture) + { + case ProcessorArchitecture.MSIL: + lw.Write("cil "); + break; + case ProcessorArchitecture.X86: + lw.Write("x86 "); + break; + case ProcessorArchitecture.IA64: + lw.Write("ia64 "); + break; + case ProcessorArchitecture.Amd64: + lw.Write("amd64 "); + break; + case ProcessorArchitecture.Arm: + if (compat == CompatLevel.None) + { + lw.Write("/*arm*/ "); + } + break; + } + lw.Write(QuoteIdentifier(asm.Name)); if (asm.Name != this.referencedAssemblies[resolvedAssemblies[i]]) { lw.Write(" as {0}", QuoteIdentifier(this.referencedAssemblies[resolvedAssemblies[i]])); diff --git a/IKVM.Reflection.dll b/IKVM.Reflection.dll index d79cd45..d603c4e 100644 Binary files a/IKVM.Reflection.dll and b/IKVM.Reflection.dll differ -- cgit v1.2.3 From d87a33d82ae72daa61da54bb1dec2c62085fce0d Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Fri, 20 Sep 2013 13:35:15 +0200 Subject: Bug fix. Handle CA attached to generic interface impl. --- Disassembler.cs | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/Disassembler.cs b/Disassembler.cs index 56c9778..5ea4f6a 100644 --- a/Disassembler.cs +++ b/Disassembler.cs @@ -807,14 +807,7 @@ namespace Ildasm if (type.BaseType != null) { lw.Write(" extends "); - if (type.BaseType.__IsMissing || !type.BaseType.IsGenericType) - { - WriteTypeDefOrRef(lw, type.BaseType); - } - else - { - WriteSignatureType(lw, type.BaseType, TypeLocation.General); - } + WriteInterfaceOrBaseType(lw, type.BaseType); lw.WriteLine(); lw.GoToColumn(level); } @@ -831,14 +824,7 @@ namespace Ildasm lw.GoToColumn(level + 18); } first = false; - if (iface.__IsMissing || !iface.IsGenericType) - { - WriteTypeDefOrRef(lw, iface); - } - else - { - WriteSignatureType(lw, iface, TypeLocation.General); - } + WriteInterfaceOrBaseType(lw, iface); } lw.WriteLine(); lw.GoToColumn(level); @@ -865,7 +851,7 @@ namespace Ildasm { lw.GoToColumn(level + 2); lw.Write(".interfaceimpl type "); - WriteTypeDefOrRef(lw, iface); + WriteInterfaceOrBaseType(lw, iface); lw.WriteLine(); WriteCustomAttributes(lw, level + 2, cas); } @@ -908,6 +894,18 @@ namespace Ildasm lw.WriteLine(); } + void WriteInterfaceOrBaseType(LineWriter lw, Type type) + { + if (type.__IsMissing || !type.IsGenericType) + { + WriteTypeDefOrRef(lw, type); + } + else + { + WriteSignatureType(lw, type, TypeLocation.General); + } + } + void WriteGenericParameterCustomAttributes(LineWriter lw, int level, Type[] args) { foreach (var typeParam in args) -- cgit v1.2.3 From 57ab0b490a4de82b1cc0816db53153ab4cae1086 Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Fri, 20 Sep 2013 15:12:58 +0200 Subject: Added /project option. --- Disassembler.cs | 9 ++++++++- IKVM.Reflection.dll | Bin 446464 -> 458752 bytes Program.cs | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Disassembler.cs b/Disassembler.cs index 5ea4f6a..b34a36f 100644 --- a/Disassembler.cs +++ b/Disassembler.cs @@ -44,6 +44,7 @@ namespace Ildasm None = 0, DiffMode = 1, Caverbal = 2, + Project = 4, } sealed partial class Disassembler @@ -59,7 +60,7 @@ namespace Ildasm const int COMIMAGE_FLAGS_STRONGNAMESIGNED = 0x00000008; const int COMIMAGE_FLAGS_NATIVE_ENTRYPOINT = 0x00000010; const int COMIMAGE_FLAGS_32BITPREFERRED = 0x00020000; - readonly Universe universe = new Universe(UniverseOptions.EnableFunctionPointers | UniverseOptions.ResolveMissingMembers | UniverseOptions.DisablePseudoCustomAttributeRetrieval); + readonly Universe universe; readonly Assembly mscorlib; readonly Type typeofSystemBoolean; readonly Type typeofSystemSByte; @@ -100,6 +101,12 @@ namespace Ildasm this.compat = compat; this.diffMode = (flags & Flags.DiffMode) != 0; this.flags = flags; + UniverseOptions options = UniverseOptions.EnableFunctionPointers | UniverseOptions.ResolveMissingMembers | UniverseOptions.DisablePseudoCustomAttributeRetrieval; + if ((flags & Flags.Project) == 0) + { + options |= UniverseOptions.DisableWindowsRuntimeProjection; + } + universe = new Universe(options); universe.AssemblyResolve += new IKVM.Reflection.ResolveEventHandler(universe_AssemblyResolve); mscorlib = universe.Import(typeof(object)).Assembly; typeofSystemBoolean = universe.Import(typeof(bool)); diff --git a/IKVM.Reflection.dll b/IKVM.Reflection.dll index d603c4e..5ebb753 100644 Binary files a/IKVM.Reflection.dll and b/IKVM.Reflection.dll differ diff --git a/Program.cs b/Program.cs index 2467971..baf2172 100644 --- a/Program.cs +++ b/Program.cs @@ -72,6 +72,10 @@ namespace Ildasm { flags |= Flags.Caverbal; } + else if (IsIldasmOption(arg, "project")) + { + flags |= Flags.Project; + } else { PrintUsage(); @@ -155,6 +159,7 @@ namespace Ildasm Console.WriteLine(" /COMPAT= Match ildasm behavior. ( = 2.0 | 4.0 | 4.5)"); Console.WriteLine(" /DIFFMODE Remove superficial differences to allow assembly comparisons"); Console.WriteLine(" /CAVERBAL Try to decode custom attribute blobs"); + Console.WriteLine(" /PROJECT Project WinMD metadata into .NET format"); } } } -- cgit v1.2.3 From 3575667a2da2ee84c05d62d1c0dc6fb18d76fc8f Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Sun, 22 Sep 2013 09:44:00 +0200 Subject: Fixed DebuggableAttribute detection. --- Disassembler.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Disassembler.cs b/Disassembler.cs index b34a36f..01caa6b 100644 --- a/Disassembler.cs +++ b/Disassembler.cs @@ -2103,8 +2103,7 @@ namespace Ildasm } foreach (var ca in cas) { - if (ca.Constructor.DeclaringType.FullName == "System.Diagnostics.DebuggableAttribute" - && ca.Constructor.DeclaringType.Assembly.GetName().Name == "mscorlib") + if (compat != CompatLevel.None && IsDebuggableAttribute(ca.AttributeType)) { lw.WriteLine(); lw.WriteLine(" // --- The following custom attribute is added automatically, do not uncomment -------"); @@ -2150,6 +2149,16 @@ namespace Ildasm lw.WriteLine("}"); } + static bool IsDebuggableAttribute(Type type) + { + return !type.IsNested + && (type.__IsMissing || !type.IsGenericType) + && !type.HasElementType + && !type.__IsFunctionPointer + && type.__Name == "DebuggableAttribute" + && type.__Namespace == "System.Diagnostics"; + } + void WriteDeclarativeSecurity(LineWriter lw, int level, IList list, int metadataToken) { var action = (System.Security.Permissions.SecurityAction)(- 1); -- cgit v1.2.3 From e85d83cb20e7c405536b78948f55ae8860a438f8 Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Sun, 22 Sep 2013 09:44:10 +0200 Subject: Updated IKVM.Reflection.dll. --- IKVM.Reflection.dll | Bin 458752 -> 458752 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/IKVM.Reflection.dll b/IKVM.Reflection.dll index 5ebb753..6353a61 100644 Binary files a/IKVM.Reflection.dll and b/IKVM.Reflection.dll differ -- cgit v1.2.3 From 77999ead540450ef4c7e6800f25b6dce3a1c9c04 Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Wed, 18 Feb 2015 11:49:34 +0100 Subject: Fixed handling of missing types in data fields. --- Disassembler.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Disassembler.cs b/Disassembler.cs index 01caa6b..d3cd15d 100644 --- a/Disassembler.cs +++ b/Disassembler.cs @@ -512,7 +512,7 @@ namespace Ildasm { typeSize = GetPointerSize(); } - else if (!type.__GetLayout(out packingSize, out typeSize)) + else if (type.__IsMissing || !type.__GetLayout(out packingSize, out typeSize)) { if (type == typeofSystemSByte || type == typeofSystemByte @@ -538,6 +538,11 @@ namespace Ildasm { typeSize = 8; } + else + { + // unknown + typeSize = 0; + } } return typeSize; } -- cgit v1.2.3 From 3ad1a30ea49866119c02e8079cbb9663e749ff41 Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Wed, 18 Feb 2015 12:24:12 +0100 Subject: Fixed property custom modifiers. --- Disassembler.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Disassembler.cs b/Disassembler.cs index d3cd15d..b7e5c1a 100644 --- a/Disassembler.cs +++ b/Disassembler.cs @@ -695,7 +695,7 @@ namespace Ildasm else if (compat == CompatLevel.V45) { lw.WriteLine(); - lw.WriteLine("// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.17929"); + lw.WriteLine("// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.18020"); lw.WriteLine("// Copyright (c) Microsoft Corporation. All rights reserved."); lw.WriteLine(); lw.WriteLine(); @@ -1065,6 +1065,7 @@ namespace Ildasm } WriteCallingConvention(lw, prop.__CallingConvention); WriteSignatureType(lw, prop.PropertyType); + WriteCustomModifiers(lw, prop.__GetCustomModifiers()); if (lw.Column > 40) { lw.WriteLine(); -- cgit v1.2.3 From 4b2255a29225ca0a6372881d585bf11781906607 Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Wed, 18 Feb 2015 12:24:33 +0100 Subject: Added 'sequential' to keywords. --- Keywords.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Keywords.cs b/Keywords.cs index e77b28f..989a457 100644 --- a/Keywords.cs +++ b/Keywords.cs @@ -191,6 +191,7 @@ namespace Ildasm "request", "runtime", "sealed", + "sequential", "serializable", "sizeof", "shl", -- cgit v1.2.3 From 8672a9ef3ab975ead3fd8496cb95f58c5abc2b7d Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Wed, 18 Feb 2015 13:12:13 +0100 Subject: Added 'permitonly' keyword. --- Keywords.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Keywords.cs b/Keywords.cs index 989a457..bdbde79 100644 --- a/Keywords.cs +++ b/Keywords.cs @@ -176,6 +176,7 @@ namespace Ildasm "opt", "or", "out", + "permitonly", "pinned", "pop", "prefix1", -- cgit v1.2.3 From 8093e6b7fd791b3e1dbe69ece5dbeb2fa0bbd4c6 Mon Sep 17 00:00:00 2001 From: Jeroen Frijters Date: Wed, 18 Feb 2015 13:12:44 +0100 Subject: Handle missing types from the current assembly. --- CABlob.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CABlob.cs b/CABlob.cs index 0e728fd..108592f 100644 --- a/CABlob.cs +++ b/CABlob.cs @@ -93,7 +93,7 @@ namespace Ildasm void AppendTypeName(StringBuilder sb, Type type, string typeName, bool noself = false, bool securityCompatHack = false) { - if (type.Assembly == assembly && !noself && (!type.IsGenericType || type.IsGenericTypeDefinition) && !type.HasElementType) + if (type.Assembly == assembly && !type.__IsMissing && !noself && (!type.IsGenericType || type.IsGenericTypeDefinition) && !type.HasElementType) { AppendTypeName(sb, type); } -- cgit v1.2.3