|
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; |
@@ -240,23 +241,35 @@ private ReadyToRunReaderCacheEntry GetReader(LoadedAssembly assembly, MetadataFi |
240 | 241 | result = new ReadyToRunReaderCacheEntry(); |
241 | 242 | try |
242 | 243 | { |
243 | | - if (file is not PEFile module) |
| 244 | + if ((file is not PEFile module) || (module.Reader == null)) |
244 | 245 | { |
245 | 246 | result.readyToRunReader = null; |
246 | 247 | result.failureReason = "File is not a valid PE file."; |
247 | 248 | } |
248 | 249 | else |
249 | 250 | { |
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); |
251 | 253 | if (result.readyToRunReader.Machine != Machine.Amd64 && result.readyToRunReader.Machine != Machine.I386) |
252 | 254 | { |
253 | 255 | result.failureReason = $"Architecture {result.readyToRunReader.Machine} is not currently supported."; |
254 | 256 | result.readyToRunReader = null; |
255 | 257 | } |
256 | 258 | else if (result.readyToRunReader.OwnerCompositeExecutable != null) |
257 | 259 | { |
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 | + |
260 | 273 | } |
261 | 274 | } |
262 | 275 | } |
@@ -288,7 +301,7 @@ public IAssemblyMetadata FindAssembly(MetadataReader metadataReader, AssemblyRef |
288 | 301 |
|
289 | 302 | public IAssemblyMetadata FindAssembly(string simpleName, string parentFile) |
290 | 303 | { |
291 | | - return GetAssemblyMetadata(assemblyResolver.ResolveModule(loadedAssembly.GetMetadataFileOrNull(), simpleName + ".dll")); |
| 304 | + return GetAssemblyMetadata(assemblyResolver.ResolveModule(loadedAssembly.GetMetadataFileOrNull(), simpleName)); |
292 | 305 | } |
293 | 306 |
|
294 | 307 | private IAssemblyMetadata GetAssemblyMetadata(MetadataFile module) |
|
0 commit comments