15
15
using System . Reflection . Metadata ;
16
16
using System . Reflection . Metadata . Ecma335 ;
17
17
using System . Reflection . PortableExecutable ;
18
- using System . Buffers ;
19
18
using System . Collections . Concurrent ;
20
19
21
20
public class ILStrip : Microsoft . Build . Utilities . Task
@@ -305,32 +304,27 @@ private Dictionary<int, int> ComputeMethodBodyUsage(MetadataReader mr, StreamRea
305
304
private void CreateTrimmedAssembly ( PEReader peReader , string trimmedAssemblyFilePath , FileStream fs , Dictionary < int , int > methodBodyUses )
306
305
{
307
306
using FileStream os = File . Open ( trimmedAssemblyFilePath , FileMode . Create ) ;
308
- {
309
- fs . Position = 0 ;
310
- MemoryStream memStream = new MemoryStream ( ( int ) fs . Length ) ;
311
- fs . CopyTo ( memStream ) ;
312
307
313
- foreach ( var kvp in methodBodyUses )
308
+ fs . Position = 0 ;
309
+ fs . CopyTo ( os ) ;
310
+
311
+ foreach ( var kvp in methodBodyUses )
312
+ {
313
+ int rva = kvp . Key ;
314
+ int count = kvp . Value ;
315
+ if ( count == 0 )
314
316
{
315
- int rva = kvp . Key ;
316
- int count = kvp . Value ;
317
- if ( count == 0 )
318
- {
319
- int methodSize = ComputeMethodSize ( peReader , rva ) ;
320
- int actualLoc = ComputeMethodHash ( peReader , rva ) ;
321
- int headerSize = ComputeMethodHeaderSize ( memStream , actualLoc ) ;
322
- if ( headerSize == 1 ) //Set code size to zero for TinyFormat
323
- SetCodeSizeToZeroForTiny ( ref memStream , actualLoc ) ;
324
- ZeroOutMethodBody ( ref memStream , methodSize , actualLoc , headerSize ) ;
325
- }
326
- else if ( count < 0 )
327
- {
328
- Log . LogError ( $ "Method usage count is less than zero for rva: { rva } .") ;
329
- }
317
+ int methodSize = ComputeMethodSize ( peReader , rva ) ;
318
+ int actualLoc = ComputeMethodHash ( peReader , rva ) ;
319
+ int headerSize = ComputeMethodHeaderSize ( fs , actualLoc ) ;
320
+ if ( headerSize == 1 ) //Set code size to zero for TinyFormat
321
+ SetCodeSizeToZeroForTiny ( os , actualLoc ) ;
322
+ ZeroOutMethodBody ( os , methodSize , actualLoc , headerSize ) ;
323
+ }
324
+ else if ( count < 0 )
325
+ {
326
+ Log . LogError ( $ "Method usage count is less than zero for rva: { rva } .") ;
330
327
}
331
-
332
- memStream . Position = 0 ;
333
- memStream . CopyTo ( os ) ;
334
328
}
335
329
}
336
330
@@ -343,30 +337,27 @@ private static int ComputeMethodHash(PEReader peReader, int rva)
343
337
return ( peReader . PEHeaders . SectionHeaders [ sectionIndex ] . PointerToRawData + relativeOffset ) ;
344
338
}
345
339
346
- private static int ComputeMethodHeaderSize ( MemoryStream memStream , int actualLoc )
340
+ private static int ComputeMethodHeaderSize ( Stream stream , int actualLoc )
347
341
{
348
- memStream . Position = actualLoc ;
349
- int firstbyte = memStream . ReadByte ( ) ;
342
+ stream . Position = actualLoc ;
343
+ int firstbyte = stream . ReadByte ( ) ;
350
344
int headerFlag = firstbyte & 0b11 ;
351
345
return ( headerFlag == 2 ? 1 : 4 ) ;
352
346
}
353
347
354
- private static void SetCodeSizeToZeroForTiny ( ref MemoryStream memStream , int actualLoc )
348
+ private static void SetCodeSizeToZeroForTiny ( Stream stream , int actualLoc )
355
349
{
356
- memStream . Position = actualLoc ;
357
- byte [ ] header = { 0b10 } ;
358
- memStream . Write ( header , 0 , 1 ) ;
350
+ stream . Position = actualLoc ;
351
+ stream . WriteByte ( 0b10 ) ;
359
352
}
360
353
361
- private static void ZeroOutMethodBody ( ref MemoryStream memStream , int methodSize , int actualLoc , int headerSize )
354
+ private static void ZeroOutMethodBody ( Stream stream , int methodSize , int actualLoc , int headerSize )
362
355
{
363
- memStream . Position = actualLoc + headerSize ;
364
-
365
- byte [ ] zeroBuffer ;
366
- zeroBuffer = ArrayPool < byte > . Shared . Rent ( methodSize ) ;
367
- Array . Clear ( zeroBuffer , 0 , zeroBuffer . Length ) ;
368
- memStream . Write ( zeroBuffer , 0 , methodSize - headerSize ) ;
369
- ArrayPool < byte > . Shared . Return ( zeroBuffer ) ;
356
+ stream . Position = actualLoc + headerSize ;
357
+ for ( int i = 0 ; i < methodSize - headerSize ; i ++ )
358
+ {
359
+ stream . WriteByte ( 0 ) ;
360
+ }
370
361
}
371
362
372
363
private static TaskItem GetTrimmedAssemblyItem ( ITaskItem assemblyItem , string trimmedAssemblyFilePath , string originAssemblyFilePath )
0 commit comments