Browse Source

Implement FindAssembly

pull/1872/head
Andrew Au 5 years ago
parent
commit
93239e2e61
  1. 26
      ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs
  2. 2
      ILSpy.ReadyToRun/ILSpy.ReadyToRun.csproj
  3. 19
      ILSpy.ReadyToRun/ReadyToRunLanguage.cs

26
ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs

@ -167,18 +167,18 @@ namespace ICSharpCode.Decompiler.Metadata @@ -167,18 +167,18 @@ namespace ICSharpCode.Decompiler.Metadata
{
static readonly SHA1 sha1 = SHA1.Create();
public PEFile Module { get; }
public MetadataReader Metadata { get; }
public AssemblyReferenceHandle Handle { get; }
System.Reflection.Metadata.AssemblyReference This() => Module.Metadata.GetAssemblyReference(Handle);
System.Reflection.Metadata.AssemblyReference This() => Metadata.GetAssemblyReference(Handle);
public bool IsWindowsRuntime => (This().Flags & AssemblyFlags.WindowsRuntime) != 0;
public bool IsRetargetable => (This().Flags & AssemblyFlags.Retargetable) != 0;
public string Name => Module.Metadata.GetString(This().Name);
public string FullName => This().GetFullAssemblyName(Module.Metadata);
public string Name => Metadata.GetString(This().Name);
public string FullName => This().GetFullAssemblyName(Metadata);
public Version Version => This().Version;
public string Culture => Module.Metadata.GetString(This().Culture);
public string Culture => Metadata.GetString(This().Culture);
byte[] IAssemblyReference.PublicKeyToken => GetPublicKeyToken();
public byte[] GetPublicKeyToken()
@ -186,18 +186,30 @@ namespace ICSharpCode.Decompiler.Metadata @@ -186,18 +186,30 @@ namespace ICSharpCode.Decompiler.Metadata
var inst = This();
if (inst.PublicKeyOrToken.IsNil)
return null;
var bytes = Module.Metadata.GetBlobBytes(inst.PublicKeyOrToken);
var bytes = Metadata.GetBlobBytes(inst.PublicKeyOrToken);
if ((inst.Flags & AssemblyFlags.PublicKey) != 0) {
return sha1.ComputeHash(bytes).Skip(12).ToArray();
}
return bytes;
}
public AssemblyReference(MetadataReader metadata, AssemblyReferenceHandle handle)
{
if (metadata == null)
throw new ArgumentNullException(nameof(metadata));
if (handle.IsNil)
throw new ArgumentNullException(nameof(handle));
Metadata = metadata;
Handle = handle;
}
public AssemblyReference(PEFile module, AssemblyReferenceHandle handle)
{
Module = module ?? throw new ArgumentNullException(nameof(module));
if (module == null)
throw new ArgumentNullException(nameof(module));
if (handle.IsNil)
throw new ArgumentNullException(nameof(handle));
Metadata = module.Metadata;
Handle = handle;
}

2
ILSpy.ReadyToRun/ILSpy.ReadyToRun.csproj

@ -45,7 +45,7 @@ @@ -45,7 +45,7 @@
<ItemGroup>
<PackageReference Include="Iced" Version="1.4.0" />
<PackageReference Include="ILCompiler.Reflection.ReadyToRun" Version="1.0.1-alpha" />
<PackageReference Include="ILCompiler.Reflection.ReadyToRun" Version="1.0.2-alpha" />
</ItemGroup>
<Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />

19
ILSpy.ReadyToRun/ReadyToRunLanguage.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
using System;
using System.ComponentModel.Composition;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Runtime.CompilerServices;
using Iced.Intel;
@ -39,13 +40,13 @@ namespace ICSharpCode.ILSpy @@ -39,13 +40,13 @@ namespace ICSharpCode.ILSpy
get { return ".asm"; }
}
private R2RReader GetReader(PEFile module)
private R2RReader GetReader(LoadedAssembly assembly, PEFile module)
{
R2RReader result;
lock (r2rReaders) {
if (!r2rReaders.TryGetValue(module, out result)) {
// TODO: avoid eager parsing
result = new R2RReader(new R2RAssemblyResolver(), module.Metadata, module.Reader, module.FileName);
result = new R2RReader(new R2RAssemblyResolver(assembly), module.Metadata, module.Reader, module.FileName);
r2rReaders.Add(module, result);
}
}
@ -55,7 +56,7 @@ namespace ICSharpCode.ILSpy @@ -55,7 +56,7 @@ namespace ICSharpCode.ILSpy
public override ProjectId DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options)
{
PEFile module = assembly.GetPEFileOrNull();
R2RReader reader = GetReader(module);
R2RReader reader = GetReader(assembly, module);
WriteCommentLine(output, "TODO - display ready to run information");
// TODO: display other header information
@ -69,7 +70,7 @@ namespace ICSharpCode.ILSpy @@ -69,7 +70,7 @@ namespace ICSharpCode.ILSpy
public override void DecompileMethod(IMethod method, ITextOutput output, DecompilationOptions options)
{
PEFile module = method.ParentModule.PEFile;
R2RReader reader = GetReader(module);
R2RReader reader = GetReader(null, module);
int bitness = -1;
if (reader.Machine == Machine.Amd64) {
bitness = 64;
@ -143,15 +144,21 @@ namespace ICSharpCode.ILSpy @@ -143,15 +144,21 @@ namespace ICSharpCode.ILSpy
private class R2RAssemblyResolver : ILCompiler.Reflection.ReadyToRun.IAssemblyResolver
{
private LoadedAssembly loadedAssembly;
public R2RAssemblyResolver(LoadedAssembly loadedAssembly)
{
this.loadedAssembly = loadedAssembly;
}
public bool Naked => false;
public bool SignatureBinary => false;
public bool InlineSignatureBinary => false;
public string FindAssembly(string name, string filename)
public MetadataReader FindAssembly(MetadataReader metadataReader, AssemblyReferenceHandle assemblyReferenceHandle, string parentFile)
{
throw new NotImplementedException();
LoadedAssembly loadedAssembly = this.loadedAssembly.LookupReferencedAssembly(new Decompiler.Metadata.AssemblyReference(metadataReader, assemblyReferenceHandle));
return loadedAssembly?.GetPEFileOrNull()?.Metadata;
}
}

Loading…
Cancel
Save