Skip to content

Commit ea7f9a7

Browse files
committed
Support disassembling single file bundle for ILSpy
1 parent d7d0f82 commit ea7f9a7

1 file changed

Lines changed: 18 additions & 5 deletions

File tree

ILSpy.ReadyToRun/ReadyToRunLanguage.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
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;
@@ -240,23 +241,35 @@ private ReadyToRunReaderCacheEntry GetReader(LoadedAssembly assembly, MetadataFi
240241
result = new ReadyToRunReaderCacheEntry();
241242
try
242243
{
243-
if (file is not PEFile module)
244+
if ((file is not PEFile module) || (module.Reader == null))
244245
{
245246
result.readyToRunReader = null;
246247
result.failureReason = "File is not a valid PE file.";
247248
}
248249
else
249250
{
250-
result.readyToRunReader = new ReadyToRunReader(new ReadyToRunAssemblyResolver(assembly), new StandaloneAssemblyMetadata(module.Reader), module.Reader, module.FileName);
251+
ImmutableArray<byte> content = module.Reader.GetEntireImage().GetContent();
252+
result.readyToRunReader = new ReadyToRunReader(new ReadyToRunAssemblyResolver(assembly), new StandaloneAssemblyMetadata(module.Reader), module.Reader, module.FileName, content);
251253
if (result.readyToRunReader.Machine != Machine.Amd64 && result.readyToRunReader.Machine != Machine.I386)
252254
{
253255
result.failureReason = $"Architecture {result.readyToRunReader.Machine} is not currently supported.";
254256
result.readyToRunReader = null;
255257
}
256258
else if (result.readyToRunReader.OwnerCompositeExecutable != null)
257259
{
258-
string compositePath = Path.Combine(Path.GetDirectoryName(module.FileName), result.readyToRunReader.OwnerCompositeExecutable);
259-
result.compositeReadyToRunReader = new ReadyToRunReader(new ReadyToRunAssemblyResolver(assembly), compositePath);
260+
string compositeModuleName = Path.GetFileNameWithoutExtension(result.readyToRunReader.OwnerCompositeExecutable);
261+
PEFile compositeFile = assembly.GetAssemblyResolver().ResolveModule(assembly.GetMetadataFileOrNull(), compositeModuleName) as PEFile;
262+
if (compositeFile == null)
263+
{
264+
result.readyToRunReader = null;
265+
result.failureReason = "Composite File is not a valid PE file.";
266+
}
267+
else
268+
{
269+
ImmutableArray<byte> compositeContent = compositeFile.Reader.GetEntireImage().GetContent();
270+
result.compositeReadyToRunReader = new ReadyToRunReader(new ReadyToRunAssemblyResolver(assembly), compositeModuleName, compositeContent);
271+
}
272+
260273
}
261274
}
262275
}
@@ -288,7 +301,7 @@ public IAssemblyMetadata FindAssembly(MetadataReader metadataReader, AssemblyRef
288301

289302
public IAssemblyMetadata FindAssembly(string simpleName, string parentFile)
290303
{
291-
return GetAssemblyMetadata(assemblyResolver.ResolveModule(loadedAssembly.GetMetadataFileOrNull(), simpleName + ".dll"));
304+
return GetAssemblyMetadata(assemblyResolver.ResolveModule(loadedAssembly.GetMetadataFileOrNull(), simpleName));
292305
}
293306

294307
private IAssemblyMetadata GetAssemblyMetadata(MetadataFile module)

0 commit comments

Comments
 (0)