Browse Source

Add ReferenceFolderTreeNode

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
ec91601510
  1. 2
      ICSharpCode.Decompiler/Metadata/Dom.cs
  2. 11
      ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs
  3. 23
      ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs
  4. 2
      ILSpy/TreeNodes/AssemblyTreeNode.cs
  5. 22
      ILSpy/TreeNodes/ModuleReferenceTreeNode.cs
  6. 23
      ILSpy/TreeNodes/ReferenceFolderTreeNode.cs

2
ICSharpCode.Decompiler/Metadata/Dom.cs

@ -116,7 +116,7 @@ namespace ICSharpCode.Decompiler.Metadata
IEnumerable<ModuleReferenceHandle> GetModuleReferences() IEnumerable<ModuleReferenceHandle> GetModuleReferences()
{ {
var rowCount = GetMetadataReader().GetTableRowCount(TableIndex.ModuleRef); var rowCount = GetMetadataReader().GetTableRowCount(TableIndex.ModuleRef);
for (int row = 0; row < rowCount; row++) { for (int row = 1; row <= rowCount; row++) {
yield return MetadataTokens.ModuleReferenceHandle(row); yield return MetadataTokens.ModuleReferenceHandle(row);
} }
} }

11
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -47,15 +47,18 @@ namespace ICSharpCode.Decompiler.Metadata
public static string GetFullAssemblyName(this SRM.AssemblyReference reference, MetadataReader reader) public static string GetFullAssemblyName(this SRM.AssemblyReference reference, MetadataReader reader)
{ {
string publicKey = "null"; string publicKey = "null";
if (!reference.PublicKeyOrToken.IsNil && (reference.Flags & AssemblyFlags.PublicKey) != 0) { if (!reference.PublicKeyOrToken.IsNil) {
SHA1 sha1 = SHA1.Create(); byte[] publicKeyTokenBytes = reader.GetBlobBytes(reference.PublicKeyOrToken);
var publicKeyTokenBytes = sha1.ComputeHash(reader.GetBlobBytes(reference.PublicKeyOrToken)).Skip(12).ToArray(); if ((reference.Flags & AssemblyFlags.PublicKey) != 0) {
SHA1 sha1 = SHA1.Create();
publicKeyTokenBytes = sha1.ComputeHash(publicKeyTokenBytes).Skip(12).ToArray();
}
publicKey = publicKeyTokenBytes.ToHexString(); publicKey = publicKeyTokenBytes.ToHexString();
} }
string properties = ""; string properties = "";
if ((reference.Flags & AssemblyFlags.Retargetable) != 0) if ((reference.Flags & AssemblyFlags.Retargetable) != 0)
properties = ", Retargetable=true"; properties = ", Retargetable=true";
return $"{reader.GetString(reference.Name)}, Version={reference.Version}, Culture={reader.GetString(reference.Culture)}, PublicKeyToken={publicKey}{properties}"; return $"{reader.GetString(reference.Name)}, Version={reference.Version}, Culture={(reference.Culture.IsNil ? "neutral" : reader.GetString(reference.Culture))}, PublicKeyToken={publicKey}{properties}";
} }
static string ToHexString(this byte[] bytes) static string ToHexString(this byte[] bytes)

23
ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs

@ -18,36 +18,33 @@
using System; using System;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using Mono.Cecil; using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
/// <summary> /// <summary>
/// Node within assembly reference list. /// Node within assembly reference list.
/// </summary> /// </summary>
/*public sealed class AssemblyReferenceTreeNode : ILSpyTreeNode public sealed class AssemblyReferenceTreeNode : ILSpyTreeNode
{ {
readonly AssemblyNameReference r; readonly AssemblyReference r;
readonly AssemblyTreeNode parentAssembly; readonly AssemblyTreeNode parentAssembly;
public AssemblyReferenceTreeNode(AssemblyNameReference r, AssemblyTreeNode parentAssembly) public AssemblyReferenceTreeNode(AssemblyReference r, AssemblyTreeNode parentAssembly)
{ {
if (parentAssembly == null) if (parentAssembly == null)
throw new ArgumentNullException(nameof(parentAssembly)); throw new ArgumentNullException(nameof(parentAssembly));
if (r == null) if (r.IsNil)
throw new ArgumentNullException(nameof(r)); throw new ArgumentNullException(nameof(r));
this.r = r; this.r = r;
this.parentAssembly = parentAssembly; this.parentAssembly = parentAssembly;
this.LazyLoading = true; this.LazyLoading = true;
} }
public AssemblyNameReference AssemblyNameReference public IAssemblyReference AssemblyNameReference => r;
{
get { return r; }
}
public override object Text { public override object Text {
get { return r.Name + r.MetadataToken.ToSuffixString(); } get { return r.Name + ((System.Reflection.Metadata.EntityHandle)r.Handle).ToSuffixString(); }
} }
public override object Icon { public override object Icon {
@ -77,7 +74,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
if (assemblyListNode != null) { if (assemblyListNode != null) {
var refNode = assemblyListNode.FindAssemblyNode(parentAssembly.LoadedAssembly.LookupReferencedAssembly(r)); var refNode = assemblyListNode.FindAssemblyNode(parentAssembly.LoadedAssembly.LookupReferencedAssembly(r));
if (refNode != null) { if (refNode != null) {
ModuleDefinition module = refNode.LoadedAssembly.GetPEFileOrNull(); var module = refNode.LoadedAssembly.GetPEFileOrNull();
if (module != null) { if (module != null) {
foreach (var childRef in module.AssemblyReferences) foreach (var childRef in module.AssemblyReferences)
this.Children.Add(new AssemblyReferenceTreeNode(childRef, refNode)); this.Children.Add(new AssemblyReferenceTreeNode(childRef, refNode));
@ -106,5 +103,5 @@ namespace ICSharpCode.ILSpy.TreeNodes
output.WriteLine(); output.WriteLine();
} }
} }
}*/ }
} }

2
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -157,7 +157,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
} }
var metadata = module.GetMetadataReader(); var metadata = module.GetMetadataReader();
this.Children.Add(new ReferenceFolderTreeNode(metadata, this)); this.Children.Add(new ReferenceFolderTreeNode(module, this));
if (module.Resources.Any()) if (module.Resources.Any())
this.Children.Add(new ResourceListTreeNode(module)); this.Children.Add(new ResourceListTreeNode(module));
foreach (NamespaceTreeNode ns in namespaces.Values) { foreach (NamespaceTreeNode ns in namespaces.Values) {

22
ILSpy/TreeNodes/ModuleReferenceTreeNode.cs

@ -17,27 +17,31 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System; using System;
using System.Reflection.Metadata;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using Mono.Cecil;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
/// <summary> /// <summary>
/// Module reference in ReferenceFolderTreeNode. /// Module reference in ReferenceFolderTreeNode.
/// </summary> /// </summary>
/*sealed class ModuleReferenceTreeNode : ILSpyTreeNode sealed class ModuleReferenceTreeNode : ILSpyTreeNode
{ {
readonly ModuleReference r; readonly MetadataReader metadata;
readonly ModuleReferenceHandle handle;
readonly ModuleReference reference;
public ModuleReferenceTreeNode(ModuleReference r) public ModuleReferenceTreeNode(ModuleReferenceHandle r, MetadataReader module)
{ {
if (r == null) if (r.IsNil)
throw new ArgumentNullException(nameof(r)); throw new ArgumentNullException(nameof(r));
this.r = r; this.metadata = module;
this.handle = r;
this.reference = module.GetModuleReference(r);
} }
public override object Text { public override object Text {
get { return r.Name + r.MetadataToken.ToSuffixString(); } get { return metadata.GetString(reference.Name) + ((EntityHandle)handle).ToSuffixString(); }
} }
public override object Icon { public override object Icon {
@ -46,7 +50,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{ {
language.WriteCommentLine(output, r.Name); language.WriteCommentLine(output, metadata.GetString(reference.Name));
} }
}*/ }
} }

23
ILSpy/TreeNodes/ReferenceFolderTreeNode.cs

@ -18,10 +18,10 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Reflection.Metadata; using SRM = System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Windows.Threading; using System.Windows.Threading;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
@ -30,10 +30,10 @@ namespace ICSharpCode.ILSpy.TreeNodes
/// </summary> /// </summary>
sealed class ReferenceFolderTreeNode : ILSpyTreeNode sealed class ReferenceFolderTreeNode : ILSpyTreeNode
{ {
readonly MetadataReader module; readonly PEFile module;
readonly AssemblyTreeNode parentAssembly; readonly AssemblyTreeNode parentAssembly;
public ReferenceFolderTreeNode(MetadataReader module, AssemblyTreeNode parentAssembly) public ReferenceFolderTreeNode(PEFile module, AssemblyTreeNode parentAssembly)
{ {
this.module = module; this.module = module;
this.parentAssembly = parentAssembly; this.parentAssembly = parentAssembly;
@ -54,10 +54,11 @@ namespace ICSharpCode.ILSpy.TreeNodes
protected override void LoadChildren() protected override void LoadChildren()
{ {
//foreach (var r in module.AssemblyReferences.OrderBy(r => r.Name)) var metadata = module.GetMetadataReader();
// this.Children.Add(new AssemblyReferenceTreeNode(r, parentAssembly)); foreach (var r in module.AssemblyReferences.OrderBy(r => r.Name))
//foreach (var r in module.ModuleReferences.OrderBy(r => r.Name)) this.Children.Add(new AssemblyReferenceTreeNode(r, parentAssembly));
// this.Children.Add(new ModuleReferenceTreeNode(r)); foreach (var r in module.ModuleReferences.OrderBy(r => metadata.GetString(metadata.GetModuleReference(r).Name)))
this.Children.Add(new ModuleReferenceTreeNode(r, metadata));
} }
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
@ -67,10 +68,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
output.WriteLine(); output.WriteLine();
language.WriteCommentLine(output, "Referenced assemblies (in metadata order):"); language.WriteCommentLine(output, "Referenced assemblies (in metadata order):");
// Show metadata order of references // Show metadata order of references
/*foreach (var r in module.AssemblyReferences) foreach (var node in this.Children.OfType<ILSpyTreeNode>())
new AssemblyReferenceTreeNode(r, parentAssembly).Decompile(language, output, options); node.Decompile(language, output, options);
foreach (var r in module.ModuleReferences)
language.WriteCommentLine(output, r.Name);*/
} }
} }
} }

Loading…
Cancel
Save