|
20 | 20 |
|
21 | 21 | using System; |
22 | 22 | using System.Collections.Generic; |
| 23 | +using System.Collections.Immutable; |
23 | 24 | using System.Composition; |
24 | 25 | using System.Diagnostics; |
25 | 26 | using System.IO; |
26 | 27 | using System.Linq; |
27 | 28 | using System.Reflection.Metadata; |
28 | 29 | using System.Reflection.PortableExecutable; |
29 | 30 | using System.Runtime.CompilerServices; |
| 31 | +using System.Runtime.InteropServices; |
30 | 32 |
|
31 | 33 | using ICSharpCode.AvalonEdit.Highlighting; |
32 | 34 | using ICSharpCode.Decompiler; |
@@ -240,23 +242,35 @@ private ReadyToRunReaderCacheEntry GetReader(LoadedAssembly assembly, MetadataFi |
240 | 242 | result = new ReadyToRunReaderCacheEntry(); |
241 | 243 | try |
242 | 244 | { |
243 | | - if (file is not PEFile module) |
| 245 | + if ((file is not PEFile module) || (module.Reader == null)) |
244 | 246 | { |
245 | 247 | result.readyToRunReader = null; |
246 | 248 | result.failureReason = "File is not a valid PE file."; |
247 | 249 | } |
248 | 250 | else |
249 | 251 | { |
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); |
251 | 254 | if (result.readyToRunReader.Machine != Machine.Amd64 && result.readyToRunReader.Machine != Machine.I386) |
252 | 255 | { |
253 | 256 | result.failureReason = $"Architecture {result.readyToRunReader.Machine} is not currently supported."; |
254 | 257 | result.readyToRunReader = null; |
255 | 258 | } |
256 | 259 | else if (result.readyToRunReader.OwnerCompositeExecutable != null) |
257 | 260 | { |
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 | + |
260 | 274 | } |
261 | 275 | } |
262 | 276 | } |
@@ -288,7 +302,7 @@ public IAssemblyMetadata FindAssembly(MetadataReader metadataReader, AssemblyRef |
288 | 302 |
|
289 | 303 | public IAssemblyMetadata FindAssembly(string simpleName, string parentFile) |
290 | 304 | { |
291 | | - return GetAssemblyMetadata(assemblyResolver.ResolveModule(loadedAssembly.GetMetadataFileOrNull(), simpleName + ".dll")); |
| 305 | + return GetAssemblyMetadata(assemblyResolver.ResolveModule(loadedAssembly.GetMetadataFileOrNull(), simpleName)); |
292 | 306 | } |
293 | 307 |
|
294 | 308 | private IAssemblyMetadata GetAssemblyMetadata(MetadataFile module) |
|
0 commit comments