diff --git a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj index e5e8ff7f3bc6..43737989df88 100644 --- a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj +++ b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj @@ -13,9 +13,12 @@ Enable - True + True $(DefineConstants);USE_SYSTEM_TEXT_JSON + + 8.0.0 + true @@ -100,7 +103,8 @@ - + + @@ -139,13 +143,16 @@ - + + + + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadManifestReader.SystemTextJson.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadManifestReader.SystemTextJson.cs index e845b7d11964..a122d085e6e8 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadManifestReader.SystemTextJson.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadManifestReader.SystemTextJson.cs @@ -3,10 +3,7 @@ #if USE_SYSTEM_TEXT_JSON -using System; using System.Buffers; -using System.Collections.Generic; -using System.IO; using System.Text.Json; namespace Microsoft.NET.Sdk.WorkloadManifestReader @@ -47,7 +44,7 @@ internal ref struct Utf8JsonStreamReader Utf8JsonReader reader; readonly Stream stream; - IMemoryOwner buffer; + byte[]? buffer; Span span; @@ -55,9 +52,9 @@ public Utf8JsonStreamReader(Stream stream, JsonReaderOptions readerOptions) { this.stream = stream; - buffer = MemoryPool.Shared.Rent(segmentSize); - var readCount = stream.Read(buffer.Memory.Span); - span = buffer.Memory.Slice(0, readCount).Span; + buffer = ArrayPool.Shared.Rent(segmentSize); + var readCount = stream.Read(buffer, 0, buffer.Length); + span = buffer.AsSpan().Slice(0, readCount); if (span.StartsWith(utf8Bom)) { @@ -73,6 +70,11 @@ public bool Read() { if (reader.IsFinalBlock) { + if (buffer != null) + { + ArrayPool.Shared.Return(buffer); + buffer = null; + } return false; } @@ -86,18 +88,21 @@ public bool Read() int remaining = (int)(span.Length - reader.BytesConsumed); - var newBuffer = MemoryPool.Shared.Rent(newSegmentSize); + var newBuffer = ArrayPool.Shared.Rent(newSegmentSize); if (remaining > 0) { - span.Slice((int)reader.BytesConsumed).CopyTo(newBuffer.Memory.Span); + span.Slice((int)reader.BytesConsumed).CopyTo(newBuffer); } - var readCount = stream.Read(newBuffer.Memory.Span.Slice(remaining)); + var readCount = stream.Read(newBuffer, remaining, newBuffer.Length - remaining); - buffer.Dispose(); + if (buffer != null) + { + ArrayPool.Shared.Return(buffer); + } buffer = newBuffer; - span = newBuffer.Memory.Slice(0, remaining + readCount).Span; + span = newBuffer.AsSpan().Slice(0, remaining + readCount); reader = new Utf8JsonReader(span, stream.Position >= stream.Length, reader.CurrentState); }