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

2
ILSpy.ReadyToRun/ILSpy.ReadyToRun.csproj

@ -45,7 +45,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Iced" Version="1.4.0" /> <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> </ItemGroup>
<Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" /> <Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />

19
ILSpy.ReadyToRun/ReadyToRunLanguage.cs

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