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 @@ -116,7 +116,7 @@ namespace ICSharpCode.Decompiler.Metadata
IEnumerable<ModuleReferenceHandle> GetModuleReferences()
{
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);
}
}

11
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -47,15 +47,18 @@ namespace ICSharpCode.Decompiler.Metadata @@ -47,15 +47,18 @@ namespace ICSharpCode.Decompiler.Metadata
public static string GetFullAssemblyName(this SRM.AssemblyReference reference, MetadataReader reader)
{
string publicKey = "null";
if (!reference.PublicKeyOrToken.IsNil && (reference.Flags & AssemblyFlags.PublicKey) != 0) {
SHA1 sha1 = SHA1.Create();
var publicKeyTokenBytes = sha1.ComputeHash(reader.GetBlobBytes(reference.PublicKeyOrToken)).Skip(12).ToArray();
if (!reference.PublicKeyOrToken.IsNil) {
byte[] publicKeyTokenBytes = reader.GetBlobBytes(reference.PublicKeyOrToken);
if ((reference.Flags & AssemblyFlags.PublicKey) != 0) {
SHA1 sha1 = SHA1.Create();
publicKeyTokenBytes = sha1.ComputeHash(publicKeyTokenBytes).Skip(12).ToArray();
}
publicKey = publicKeyTokenBytes.ToHexString();
}
string properties = "";
if ((reference.Flags & AssemblyFlags.Retargetable) != 0)
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)

23
ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs

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

2
ILSpy/TreeNodes/AssemblyTreeNode.cs

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

22
ILSpy/TreeNodes/ModuleReferenceTreeNode.cs

@ -17,27 +17,31 @@ @@ -17,27 +17,31 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Reflection.Metadata;
using ICSharpCode.Decompiler;
using Mono.Cecil;
namespace ICSharpCode.ILSpy.TreeNodes
{
/// <summary>
/// Module reference in ReferenceFolderTreeNode.
/// </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));
this.r = r;
this.metadata = module;
this.handle = r;
this.reference = module.GetModuleReference(r);
}
public override object Text {
get { return r.Name + r.MetadataToken.ToSuffixString(); }
get { return metadata.GetString(reference.Name) + ((EntityHandle)handle).ToSuffixString(); }
}
public override object Icon {
@ -46,7 +50,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -46,7 +50,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
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 @@ @@ -18,10 +18,10 @@
using System;
using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using SRM = System.Reflection.Metadata;
using System.Windows.Threading;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.TreeNodes
{
@ -30,10 +30,10 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -30,10 +30,10 @@ namespace ICSharpCode.ILSpy.TreeNodes
/// </summary>
sealed class ReferenceFolderTreeNode : ILSpyTreeNode
{
readonly MetadataReader module;
readonly PEFile module;
readonly AssemblyTreeNode parentAssembly;
public ReferenceFolderTreeNode(MetadataReader module, AssemblyTreeNode parentAssembly)
public ReferenceFolderTreeNode(PEFile module, AssemblyTreeNode parentAssembly)
{
this.module = module;
this.parentAssembly = parentAssembly;
@ -54,10 +54,11 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -54,10 +54,11 @@ namespace ICSharpCode.ILSpy.TreeNodes
protected override void LoadChildren()
{
//foreach (var r in module.AssemblyReferences.OrderBy(r => r.Name))
// this.Children.Add(new AssemblyReferenceTreeNode(r, parentAssembly));
//foreach (var r in module.ModuleReferences.OrderBy(r => r.Name))
// this.Children.Add(new ModuleReferenceTreeNode(r));
var metadata = module.GetMetadataReader();
foreach (var r in module.AssemblyReferences.OrderBy(r => r.Name))
this.Children.Add(new AssemblyReferenceTreeNode(r, parentAssembly));
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)
@ -67,10 +68,8 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -67,10 +68,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
output.WriteLine();
language.WriteCommentLine(output, "Referenced assemblies (in metadata order):");
// Show metadata order of references
/*foreach (var r in module.AssemblyReferences)
new AssemblyReferenceTreeNode(r, parentAssembly).Decompile(language, output, options);
foreach (var r in module.ModuleReferences)
language.WriteCommentLine(output, r.Name);*/
foreach (var node in this.Children.OfType<ILSpyTreeNode>())
node.Decompile(language, output, options);
}
}
}

Loading…
Cancel
Save