@@ -379,10 +379,12 @@ internal IAssemblyMetadata R2RManifestMetadata
379379 }
380380
381381 /// <summary>
382- /// Initializes the fields of the R2RHeader and R2RMethods
382+ /// Minimally initializes the R2R reader.
383383 /// </summary>
384- /// <param name="filename">PE image</param>
385- /// <exception cref="BadImageFormatException">The Cor header flag must be ILLibrary</exception>
384+ /// <param name="assemblyResolver">Assembly resolver</param>
385+ /// <param name="metadata">Assembly metadata</param>
386+ /// <param name="peReader">PE image</param>
387+ /// <param name="filename">PE file name</param>
386388 public ReadyToRunReader ( IAssemblyResolver assemblyResolver , IAssemblyMetadata metadata , PEReader peReader , string filename )
387389 {
388390 _assemblyResolver = assemblyResolver ;
@@ -392,17 +394,57 @@ public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata me
392394 }
393395
394396 /// <summary>
395- /// Initializes the fields of the R2RHeader and R2RMethods
397+ /// Minimally initializes the R2R reader.
396398 /// </summary>
397- /// <param name="filename">PE image</param>
398- /// <exception cref="BadImageFormatException">The Cor header flag must be ILLibrary</exception>
399+ /// <param name="assemblyResolver">Assembly resolver</param>
400+ /// <param name="metadata">Assembly metadata</param>
401+ /// <param name="peReader">PE image</param>
402+ /// <param name="filename">PE file name</param>
403+ /// <param name="content">PE image content</param>
404+ public ReadyToRunReader ( IAssemblyResolver assemblyResolver , IAssemblyMetadata metadata , PEReader peReader , string filename , ReadOnlyMemory < byte > content )
405+ {
406+ _assemblyResolver = assemblyResolver ;
407+ CompositeReader = peReader ;
408+ Filename = filename ;
409+ Image = ConvertToArray ( content ) ;
410+ Initialize ( metadata ) ;
411+ }
412+
413+ /// <summary>
414+ /// Minimally initializes the R2R reader.
415+ /// </summary>
416+ /// <param name="assemblyResolver">Assembly resolver</param>
417+ /// <param name="filename">PE file name</param>
399418 public unsafe ReadyToRunReader ( IAssemblyResolver assemblyResolver , string filename )
400419 {
401420 _assemblyResolver = assemblyResolver ;
402421 Filename = filename ;
403422 Initialize ( metadata : null ) ;
404423 }
405424
425+ /// <summary>
426+ /// Minimally initializes the R2R reader.
427+ /// </summary>
428+ /// <param name="assemblyResolver">Assembly resolver</param>
429+ /// <param name="filename">PE file name</param>
430+ /// <param name="content">PE image content</param>
431+ public unsafe ReadyToRunReader ( IAssemblyResolver assemblyResolver , string filename , ReadOnlyMemory < byte > content )
432+ {
433+ _assemblyResolver = assemblyResolver ;
434+ Filename = filename ;
435+ Image = ConvertToArray ( content ) ;
436+ Initialize ( metadata : null ) ;
437+ }
438+
439+ private unsafe byte [ ] ConvertToArray ( ReadOnlyMemory < byte > content )
440+ {
441+ if ( MemoryMarshal . TryGetArray ( content , out ArraySegment < byte > segment ) && ( segment . Offset == 0 ) && ( segment . Count == content . Length ) )
442+ {
443+ return segment . Array ;
444+ }
445+ return content . ToArray ( ) ;
446+ }
447+
406448 public static bool IsReadyToRunImage ( PEReader peReader )
407449 {
408450 if ( peReader . PEHeaders == null )
@@ -441,10 +483,9 @@ private unsafe void Initialize(IAssemblyMetadata metadata)
441483
442484 if ( CompositeReader == null )
443485 {
444- byte [ ] image = File . ReadAllBytes ( Filename ) ;
445- Image = image ;
486+ Image ?? = File . ReadAllBytes ( Filename ) ;
487+ byte [ ] image = Image ;
446488 ImagePin = new PinningReference ( image ) ;
447-
448489 CompositeReader = new PEReader ( Unsafe . As < byte [ ] , ImmutableArray < byte > > ( ref image ) ) ;
449490 }
450491 else
@@ -1140,7 +1181,7 @@ private void CountRuntimeFunctions(bool[] isEntryPoint, IDictionary<int, int[]>
11401181 count ++ ;
11411182 i ++ ;
11421183 } while ( i < isEntryPoint . Length && ! isEntryPoint [ i ] && i < firstColdRuntimeFunction ) ;
1143-
1184+
11441185 if ( dHotColdMap . ContainsKey ( runtimeFunctionId ) )
11451186 {
11461187 int coldSize = dHotColdMap [ runtimeFunctionId ] . Length ;
0 commit comments