diff --git a/src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs b/src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs index a71e2b69321f7d..288c7ef3711c8a 100644 --- a/src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs +++ b/src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs @@ -15,7 +15,6 @@ using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; using System.Reflection.PortableExecutable; -using System.Buffers; using System.Collections.Concurrent; public class ILStrip : Microsoft.Build.Utilities.Task @@ -305,32 +304,27 @@ private Dictionary ComputeMethodBodyUsage(MetadataReader mr, StreamRea private void CreateTrimmedAssembly(PEReader peReader, string trimmedAssemblyFilePath, FileStream fs, Dictionary methodBodyUses) { using FileStream os = File.Open(trimmedAssemblyFilePath, FileMode.Create); - { - fs.Position = 0; - MemoryStream memStream = new MemoryStream((int)fs.Length); - fs.CopyTo(memStream); - foreach (var kvp in methodBodyUses) + fs.Position = 0; + fs.CopyTo(os); + + foreach (var kvp in methodBodyUses) + { + int rva = kvp.Key; + int count = kvp.Value; + if (count == 0) { - int rva = kvp.Key; - int count = kvp.Value; - if (count == 0) - { - int methodSize = ComputeMethodSize(peReader, rva); - int actualLoc = ComputeMethodHash(peReader, rva); - int headerSize = ComputeMethodHeaderSize(memStream, actualLoc); - if (headerSize == 1) //Set code size to zero for TinyFormat - SetCodeSizeToZeroForTiny(ref memStream, actualLoc); - ZeroOutMethodBody(ref memStream, methodSize, actualLoc, headerSize); - } - else if (count < 0) - { - Log.LogError($"Method usage count is less than zero for rva: {rva}."); - } + int methodSize = ComputeMethodSize(peReader, rva); + int actualLoc = ComputeMethodHash(peReader, rva); + int headerSize = ComputeMethodHeaderSize(fs, actualLoc); + if (headerSize == 1) //Set code size to zero for TinyFormat + SetCodeSizeToZeroForTiny(os, actualLoc); + ZeroOutMethodBody(os, methodSize, actualLoc, headerSize); + } + else if (count < 0) + { + Log.LogError($"Method usage count is less than zero for rva: {rva}."); } - - memStream.Position = 0; - memStream.CopyTo(os); } } @@ -343,30 +337,27 @@ private static int ComputeMethodHash(PEReader peReader, int rva) return (peReader.PEHeaders.SectionHeaders[sectionIndex].PointerToRawData + relativeOffset); } - private static int ComputeMethodHeaderSize(MemoryStream memStream, int actualLoc) + private static int ComputeMethodHeaderSize(Stream stream, int actualLoc) { - memStream.Position = actualLoc; - int firstbyte = memStream.ReadByte(); + stream.Position = actualLoc; + int firstbyte = stream.ReadByte(); int headerFlag = firstbyte & 0b11; return (headerFlag == 2 ? 1 : 4); } - private static void SetCodeSizeToZeroForTiny(ref MemoryStream memStream, int actualLoc) + private static void SetCodeSizeToZeroForTiny(Stream stream, int actualLoc) { - memStream.Position = actualLoc; - byte[] header = {0b10}; - memStream.Write(header, 0, 1); + stream.Position = actualLoc; + stream.WriteByte(0b10); } - private static void ZeroOutMethodBody(ref MemoryStream memStream, int methodSize, int actualLoc, int headerSize) + private static void ZeroOutMethodBody(Stream stream, int methodSize, int actualLoc, int headerSize) { - memStream.Position = actualLoc + headerSize; - - byte[] zeroBuffer; - zeroBuffer = ArrayPool.Shared.Rent(methodSize); - Array.Clear(zeroBuffer, 0, zeroBuffer.Length); - memStream.Write(zeroBuffer, 0, methodSize - headerSize); - ArrayPool.Shared.Return(zeroBuffer); + stream.Position = actualLoc + headerSize; + for (int i = 0; i < methodSize - headerSize; i++) + { + stream.WriteByte(0); + } } private static TaskItem GetTrimmedAssemblyItem(ITaskItem assemblyItem, string trimmedAssemblyFilePath, string originAssemblyFilePath)