Skip to content

Commit e3e4d57

Browse files
cshungsiegfriedpammer
authored andcommitted
Support disassembling single file bundle for ILSpy
1 parent 29e5e7d commit e3e4d57

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

ILSpy.ReadyToRun/ReadyToRunLanguage.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020

2121
using System;
2222
using System.Collections.Generic;
23+
using System.Collections.Immutable;
2324
using System.Composition;
2425
using System.Diagnostics;
2526
using System.IO;
2627
using System.Linq;
2728
using System.Reflection.Metadata;
2829
using System.Reflection.PortableExecutable;
2930
using System.Runtime.CompilerServices;
31+
using System.Runtime.InteropServices;
3032

3133
using ICSharpCode.AvalonEdit.Highlighting;
3234
using ICSharpCode.Decompiler;
@@ -240,23 +242,35 @@ private ReadyToRunReaderCacheEntry GetReader(LoadedAssembly assembly, MetadataFi
240242
result = new ReadyToRunReaderCacheEntry();
241243
try
242244
{
243-
if (file is not PEFile module)
245+
if ((file is not PEFile module) || (module.Reader == null))
244246
{
245247
result.readyToRunReader = null;
246248
result.failureReason = "File is not a valid PE file.";
247249
}
248250
else
249251
{
250-
result.readyToRunReader = new ReadyToRunReader(new ReadyToRunAssemblyResolver(assembly), new StandaloneAssemblyMetadata(module.Reader), module.Reader, module.FileName);
252+
ReadOnlyMemory<byte> content = module.Reader.GetEntireImage().GetContent().AsMemory();
253+
result.readyToRunReader = new ReadyToRunReader(new ReadyToRunAssemblyResolver(assembly), new StandaloneAssemblyMetadata(module.Reader), module.Reader, module.FileName, content);
251254
if (result.readyToRunReader.Machine != Machine.Amd64 && result.readyToRunReader.Machine != Machine.I386)
252255
{
253256
result.failureReason = $"Architecture {result.readyToRunReader.Machine} is not currently supported.";
254257
result.readyToRunReader = null;
255258
}
256259
else if (result.readyToRunReader.OwnerCompositeExecutable != null)
257260
{
258-
string compositePath = Path.Combine(Path.GetDirectoryName(module.FileName), result.readyToRunReader.OwnerCompositeExecutable);
259-
result.compositeReadyToRunReader = new ReadyToRunReader(new ReadyToRunAssemblyResolver(assembly), compositePath);
261+
string compositeModuleName = Path.GetFileNameWithoutExtension(result.readyToRunReader.OwnerCompositeExecutable);
262+
PEFile compositeFile = assembly.GetAssemblyResolver().ResolveModule(assembly.GetMetadataFileOrNull(), compositeModuleName) as PEFile;
263+
if (compositeFile == null)
264+
{
265+
result.readyToRunReader = null;
266+
result.failureReason = "Composite File is not a valid PE file.";
267+
}
268+
else
269+
{
270+
ReadOnlyMemory<byte> compositeContent = compositeFile.Reader.GetEntireImage().GetContent().AsMemory();
271+
result.compositeReadyToRunReader = new ReadyToRunReader(new ReadyToRunAssemblyResolver(assembly), compositeModuleName, compositeContent);
272+
}
273+
260274
}
261275
}
262276
}
@@ -288,7 +302,7 @@ public IAssemblyMetadata FindAssembly(MetadataReader metadataReader, AssemblyRef
288302

289303
public IAssemblyMetadata FindAssembly(string simpleName, string parentFile)
290304
{
291-
return GetAssemblyMetadata(assemblyResolver.ResolveModule(loadedAssembly.GetMetadataFileOrNull(), simpleName + ".dll"));
305+
return GetAssemblyMetadata(assemblyResolver.ResolveModule(loadedAssembly.GetMetadataFileOrNull(), simpleName));
292306
}
293307

294308
private IAssemblyMetadata GetAssemblyMetadata(MetadataFile module)

0 commit comments

Comments
 (0)