11using System ;
2+ #if NET45 || NET471 || NETSTANDARD
3+ using System . Buffers ;
4+ #endif
25using System . Runtime . InteropServices ;
36using System . Text ;
47#if NET40
@@ -262,7 +265,7 @@ public byte[] ArrayBufferBytes
262265 return new byte [ 0 ] ;
263266 }
264267
265- byte [ ] buffer = new byte [ bufferLength ] ;
268+ var buffer = new byte [ bufferLength ] ;
266269 Marshal . Copy ( bufferPtr , buffer , 0 , ( int ) bufferLength ) ;
267270
268271 return buffer ;
@@ -729,12 +732,29 @@ public int ToInt32()
729732 JsErrorHelpers . ThrowIfError ( errorCode ) ;
730733
731734 length = ( int ) written ;
735+ #if NET45 || NET471 || NETSTANDARD
736+ var charArrayPool = ArrayPool < char > . Shared ;
737+ buffer = charArrayPool . Rent ( length ) ;
738+
739+ try
740+ {
741+ errorCode = NativeMethods . JsCopyStringUtf16 ( this , start , length , buffer , out written ) ;
742+ JsErrorHelpers . ThrowIfError ( errorCode ) ;
743+
744+ result = new string ( buffer , start , length ) ;
745+ }
746+ finally
747+ {
748+ charArrayPool . Return ( buffer , true ) ;
749+ }
750+ #else
732751 buffer = new char [ length ] ;
733752
734753 errorCode = NativeMethods . JsCopyStringUtf16 ( this , start , length , buffer , out written ) ;
735754 JsErrorHelpers . ThrowIfError ( errorCode ) ;
736755
737756 result = new string ( buffer ) ;
757+ #endif
738758 }
739759 else
740760 {
@@ -745,13 +765,30 @@ public int ToInt32()
745765 errorCode = NativeMethods . JsCopyString ( this , buffer , bufferSize , out length ) ;
746766 JsErrorHelpers . ThrowIfError ( errorCode ) ;
747767
748- buffer = new byte [ ( int ) length ] ;
749768 bufferSize = length ;
769+ #if NET45 || NET471 || NETSTANDARD
770+ var byteArrayPool = ArrayPool < byte > . Shared ;
771+ buffer = byteArrayPool . Rent ( ( int ) bufferSize ) ;
772+
773+ try
774+ {
775+ errorCode = NativeMethods . JsCopyString ( this , buffer , bufferSize , out length ) ;
776+ JsErrorHelpers . ThrowIfError ( errorCode ) ;
777+
778+ result = Encoding . UTF8 . GetString ( buffer , 0 , ( int ) bufferSize ) ;
779+ }
780+ finally
781+ {
782+ byteArrayPool . Return ( buffer , true ) ;
783+ }
784+ #else
785+ buffer = new byte [ ( int ) bufferSize ] ;
750786
751787 errorCode = NativeMethods . JsCopyString ( this , buffer , bufferSize , out length ) ;
752788 JsErrorHelpers . ThrowIfError ( errorCode ) ;
753789
754790 result = Encoding . UTF8 . GetString ( buffer ) ;
791+ #endif
755792 }
756793
757794 return result ;
0 commit comments