FrameworkExtensions.Backports
1.0.0.256
dotnet add package FrameworkExtensions.Backports --version 1.0.0.256
NuGet\Install-Package FrameworkExtensions.Backports -Version 1.0.0.256
<PackageReference Include="FrameworkExtensions.Backports" Version="1.0.0.256" />
<PackageVersion Include="FrameworkExtensions.Backports" Version="1.0.0.256" />
<PackageReference Include="FrameworkExtensions.Backports" />
paket add FrameworkExtensions.Backports --version 1.0.0.256
#r "nuget: FrameworkExtensions.Backports, 1.0.0.256"
#:package FrameworkExtensions.Backports@1.0.0.256
#addin nuget:?package=FrameworkExtensions.Backports&version=1.0.0.256
#tool nuget:?package=FrameworkExtensions.Backports&version=1.0.0.256
FrameworkExtensions.Backports
Overview
FrameworkExtensions.Backports is a NuGet package that provides a collection of extensions (Polyfills) to ensure that newer compiler features work in older versions of the .NET Framework/Standard/Core. This package allows developers to use modern C# language features and .NET APIs even when working on projects targeting earlier versions down to Net2.0.
Performance is not a primary concern here. This focuses mainly on functionality and ready-to-be-built without making adjustments to code.
How It Works
The package uses conditional compilation (#if directives) and MSBuild target framework detection to decide, per feature, whether to:
- Use the native implementation -- when the target framework already provides the API (e.g.,
Span<T>on .NET Core 2.1+). - Reference an official Microsoft NuGet package -- when Microsoft ships a standalone backport (e.g.,
System.Memoryfor .NET Framework 4.5+). - Provide a custom polyfill -- when neither of the above is available (e.g.,
Span<T>on .NET Framework 2.0/3.5).
All polyfills live under the original namespace of the type they replace, so consuming code requires no extra using directives and compiles identically across all targets.
Supported Target Frameworks
| Target Framework | TFM | Notes |
|---|---|---|
| .NET Framework 2.0 | net20 |
Oldest supported; custom polyfills for most APIs |
| .NET Framework 3.5 | net35 |
Adds LINQ expressions, DLR |
| .NET Framework 4.0 | net40 |
Task/async support via Microsoft.Bcl.Async |
| .NET Framework 4.5 | net45 |
Official System.Memory, System.Buffers packages used |
| .NET Framework 4.6 | net46 |
|
| .NET Framework 4.6.1 | net461 |
Official System.Collections.Immutable, Microsoft.Bcl.HashCode used |
| .NET Framework 4.6.2 | net462 |
|
| .NET Framework 4.7 | net47 |
|
| .NET Framework 4.7.1 | net471 |
|
| .NET Framework 4.7.2 | net472 |
|
| .NET Framework 4.8 | net48 |
|
| .NET Standard 2.0 | netstandard2.0 |
Broad compatibility surface |
| .NET Standard 2.1 | netstandard2.1 |
Adds Span-native APIs |
| .NET Core 3.1 | netcoreapp3.1 |
|
| .NET 5.0 | net5.0 |
|
| .NET 6.0 | net6.0 |
|
| .NET 7.0 | net7.0 |
|
| .NET 8.0 | net8.0 |
|
| .NET 9.0 | net9.0 |
Architecture
Official Package Integration
To avoid conflicts with official Microsoft BCL backport packages and ensure optimal compatibility, FrameworkExtensions.Backports uses a hybrid approach:
When official packages exist: For target frameworks where Microsoft provides official backport packages (such as System.Memory, System.Buffers, System.ValueTuple, etc.), this package automatically references and uses those official implementations.
When official packages don't exist: For older target frameworks (like .NET Framework 2.0, 3.5) or for features not covered by official packages, this package provides custom backport implementations.
This approach means:
- ✅ Users only need to reference
FrameworkExtensions.Backports- all necessary dependencies are included automatically - ✅ No package conflicts - official implementations are used when available, avoiding type conflicts
- ✅ Better performance and compatibility - official Microsoft implementations are optimized and thoroughly tested
- ✅ Seamless experience - the same API surface works across all target frameworks
Official Packages Included
The following official Microsoft packages are conditionally referenced based on your target framework:
Active Packages:
- System.Memory - Provides
Span<T>,ReadOnlySpan<T>,Memory<T>, andMemoryMarshal(.NET Framework 4.5+, .NET Standard 2.0) - System.Buffers - Provides
ArrayPool<T>(.NET Framework 4.5+, .NET Standard 2.0) - System.ValueTuple - Provides
ValueTupletypes (.NET Framework 4.0+) - System.Runtime.CompilerServices.Unsafe - Provides the
Unsafeclass (.NET Framework 4.5+, .NET Standard 1.0+) - System.Numerics.Vectors - Provides
Vectortypes (.NET Framework 4.5+, .NET Standard 2.0) - System.Numerics.Tensors - Provides
Tensor<T>,TensorSpan<T>,TensorPrimitivesand related tensor types (.NET 9.0+; polyfill for earlier versions) - System.Threading.Tasks.Extensions - Provides
ValueTask(.NET Framework 4.5+, .NET Standard 2.0) - Microsoft.Bcl.HashCode - Provides
HashCode(.NET Framework 4.6.1+, .NET Standard 2.0) - Microsoft.Bcl.AsyncInterfaces - Provides
IAsyncEnumerable<T>,IAsyncDisposableand related async interfaces (.NET Framework 4.6.1+, .NET Standard 2.0) - System.Runtime.InteropServices.RuntimeInformation - Provides
RuntimeInformation,OSPlatform,Architecture(.NET Framework 4.5+) - System.Collections.Immutable - Provides
ImmutableArray<T>,ImmutableDictionary<TKey,TValue>, and other immutable collections (.NET Framework 4.6.1+, .NET Standard 2.0) - System.Text.Json - Provides
JsonSerializer,JsonDocument,Utf8JsonReader/Writerand related JSON types (.NET Framework 4.6.2+, .NET Standard 2.0) - System.IO.Hashing - Provides
Crc32,Crc64,XxHash32,XxHash64,XxHash128(.NET Framework 4.6.2+, .NET Standard 2.0)
Deprecated Packages (still included for compatibility):
- Microsoft.Bcl - Provides
CallerMemberNameAttributeand related attributes (.NET Framework 4.0 only) - Microsoft.Bcl.Async - Provides
TaskAwaiterand async/await support (.NET Framework 4.0 only)
Microsoft.Bcl and Microsoft.Bcl.Async are officially deprecated but are still included for .NET Framework 4.0 to avoid conflicts with existing projects that may reference these packages.
For target frameworks where these packages are not available (e.g., .NET Framework 2.0/3.5), custom implementations are provided.
Project Structure
Backports/
Backports.csproj # Multi-targeting project file (net20 through net9.0)
Features/ # Feature directories, each containing one polyfill
ActionFunc/ # Action/Func delegate types
AggregateException/ # AggregateException for pre-.NET 4.0
AsyncEnumerable/ # IAsyncEnumerable/IAsyncEnumerator
BigInteger/ # System.Numerics.BigInteger polyfill
CollectionsMarshal/ # CollectionsMarshal.AsSpan, GetValueRefOrNullRef, SetCount
ExceptionDispatchInfo/ # Exception capture/rethrow preserving stack trace
FormattableString/ # C# 6 string interpolation support
RuntimeInformation/ # OSPlatform, Architecture, RuntimeInformation
SystemTextJson/ # JSON serialization polyfill
... # (one directory per feature)
System/ # Shared type definitions and helpers
Utilities/ # Internal utilities (method impl options, guards, etc.)
build/ # MSBuild .props/.targets for conditional compilation flags
Each feature directory follows the pattern Features/<FeatureName>/System/<Namespace>/<TypeName>.cs and is guarded by a #if !SUPPORTS_<FEATURE> conditional compilation directive that is set in the build/ directory's .props files.
Features
Interfaces
System
- IGrouping<out TKey, TElement>
- ILookup<TKey, TElement>
- IParsable
- ISpanFormattable
- ISpanParsable
System.Collections
System
System.Collections.Generic
- IAsyncEnumerable<T>
- IAsyncEnumerator<T>
- IReadOnlyCollection<T>
- IReadOnlyDictionary<TKey, TValue>
- IReadOnlyList<T>
- IReadOnlySet<T>
- ISet<T>
System.Runtime.CompilerServices
System.Threading
System.Threading.Tasks.Sources
- IValueTaskSource
- IValueTaskSource<TResult>
Types
System
- AggregateException
- DateOnly
- FormattableString
- Half
- HashCode (polyfill for frameworks without Microsoft.Bcl.HashCode)
- Index
- Int128
- Lazy<T>
- MathF
- OperatingSystem (platform detection methods)
- Range
- ReadOnlySpan<T>
- Span<T>
- TimeOnly
- TimeProvider
- TimeZoneInfo (minimal stub for frameworks without native support)
- Tuple<T> (up to 8 types)
- UInt128
- ValueTuple<T> (up to 8 types)
System
System.Buffers
- ArrayPool<T>
- IMemoryOwner<T>
- MemoryManager<T>
- MemoryPool<T>
- NIndex (native integer index for tensors)
- NRange (native integer range for tensors)
- ReadOnlySequence<T>
- ReadOnlySequenceSegment<T>
- SequenceReader<T>
- SearchValues<T>
System.Collections.Concurrent
- ConcurrentBag<T>
- ConcurrentDictionary<TKey, TValue>
- ConcurrentQueue<T>
- ConcurrentStack<T>
- EnumerablePartitionerOptions
- OrderablePartitioner<TSource>
- Partitioner
- Partitioner<TSource>
System.Collections.Frozen
- FrozenDictionary<TKey, TValue>
- FrozenSet<T>
System.Collections.Immutable (uses official package for net461+/netstandard2.0+/netcoreapp2.0+, polyfill for others)
- ImmutableArray<T>
- ImmutableDictionary<TKey, TValue>
- ImmutableHashSet<T>
- ImmutableList<T>
- ImmutableQueue<T>
- ImmutableSortedDictionary<TKey, TValue>
- ImmutableSortedSet<T>
- ImmutableStack<T>
System.Collections.Generic
- HashSet<T>
- OrderedDictionary<TKey, TValue>
- SortedSet<T>
- PriorityQueue<TElement, TPriority>
- ReadOnlyDictionary<TKey, TValue>
System.IO.Compression
System.Numerics
- BigInteger
- BitOperations
- Complex
- IAdditionOperators<TSelf, TOther, TResult> (marker interface)
- IAdditiveIdentity<TSelf, TResult> (marker interface)
- IBinaryInteger<TSelf> (marker interface)
- IBinaryNumber<TSelf> (marker interface)
- IBitwiseOperators<TSelf, TOther, TResult> (marker interface)
- IComparisonOperators<TSelf, TOther, TResult> (marker interface)
- IDecrementOperators<TSelf> (marker interface)
- IDivisionOperators<TSelf, TOther, TResult> (marker interface)
- IEqualityOperators<TSelf, TOther, TResult> (marker interface)
- IExponentialFunctions<TSelf> (marker interface)
- IFloatingPoint<TSelf> (marker interface)
- IFloatingPointConstants<TSelf> (marker interface)
- IFloatingPointIeee754<TSelf> (marker interface)
- IHyperbolicFunctions<TSelf> (marker interface)
- IIncrementOperators<TSelf> (marker interface)
- ILogarithmicFunctions<TSelf> (marker interface)
- IMinMaxValue<TSelf> (marker interface)
- IModulusOperators<TSelf, TOther, TResult> (marker interface)
- IMultiplicativeIdentity<TSelf, TResult> (marker interface)
- IMultiplyOperators<TSelf, TOther, TResult> (marker interface)
- INumber<TSelf> (marker interface)
- INumberBase<TSelf> (marker interface)
- IPowerFunctions<TSelf> (marker interface)
- IRootFunctions<TSelf> (marker interface)
- IShiftOperators<TSelf, TOther, TResult> (marker interface)
- ISignedNumber<TSelf> (marker interface)
- ISubtractionOperators<TSelf, TOther, TResult> (marker interface)
- ITrigonometricFunctions<TSelf> (marker interface)
- IUnaryNegationOperators<TSelf, TResult> (marker interface)
- IUnaryPlusOperators<TSelf, TResult> (marker interface)
- IUnsignedNumber<TSelf> (marker interface)
- Matrix3x2
- Matrix4x4
- Plane
- Quaternion
- Vector
- Vector<T>
- Vector2
- Vector3
- Vector4
System.Numerics.Tensors
- ReadOnlyTensorSpan<T>
- ReadOnlyTensorDimensionSpan<T>
- Tensor (static factory and operations)
- Tensor<T>
- TensorDimensionSpan<T>
- TensorPrimitives
- TensorSpan<T>
System.Runtime.CompilerServices
- AsyncIteratorMethodBuilder
- AsyncTaskMethodBuilder<T>
- AsyncValueTaskMethodBuilder
- AsyncValueTaskMethodBuilder<TResult>
- ConditionalWeakTable<TKey,TValue>
- ConfiguredCancelableAsyncEnumerable<T>
- ConfiguredTaskAwaitable<T>
- ConfiguredValueTaskAwaitable
- ConfiguredValueTaskAwaitable<TResult>
- IsExternalInit
- TaskAwaiter<T>
- Unsafe
- ValueTaskAwaiter
- ValueTaskAwaiter<TResult>
System.Reflection
System.Runtime.InteropServices
System.Runtime.ExceptionServices
System.Runtime.Intrinsics
System.Runtime.Intrinsics.Arm
System.Runtime.Intrinsics.X86
System.Threading
System.Threading.Tasks
System.Threading.Tasks.Sources
System.Collections.Generic
System.IO
System.Text
System.Text.Json (uses official package for net462+/netstandard2.0+/netcoreapp3.0+, polyfill for others)
System.Text.Json.Serialization
System.Net.Http
- HttpContent (ReadAsStream polyfill)
System.Web
- HttpContext (minimal polyfill for .NET Core)
- HttpCookie (minimal polyfill for .NET Core)
- HttpCookieCollection (minimal polyfill for .NET Core)
- HttpRequest (minimal polyfill for .NET Core)
- HttpResponse (minimal polyfill for .NET Core)
System.IO.Hashing
System.Linq.Expressions
- BinaryExpression
- BlockExpression
- CatchBlock
- ConditionalExpression
- ConstantExpression
- DefaultExpression
- DynamicExpression
- ElementInit
- Expression
- Expression<TDelegate>
- ExpressionType
- ExpressionVisitor
- GotoExpression
- GotoExpressionKind
- IndexExpression
- InvocationExpression
- LabelExpression
- LabelTarget
- LambdaExpression
- ListInitExpression
- LoopExpression
- MemberAssignment
- MemberBinding
- MemberBindingType
- MemberExpression
- MemberInitExpression
- MemberListBinding
- MemberMemberBinding
- MethodCallExpression
- NewArrayExpression
- NewExpression
- ParameterExpression
- SwitchCase
- SwitchExpression
- TryExpression
- TypeBinaryExpression
- UnaryExpression
System.Dynamic
- BinaryOperationBinder
- BindingRestrictions
- CallInfo
- ConvertBinder
- CreateInstanceBinder
- DeleteIndexBinder
- DeleteMemberBinder
- DynamicMetaObject
- DynamicMetaObjectBinder
- DynamicObject
- ExpandoObject
- GetIndexBinder
- GetMemberBinder
- IDynamicMetaObjectProvider
- InvokeBinder
- InvokeMemberBinder
- SetIndexBinder
- SetMemberBinder
- UnaryOperationBinder
System.Runtime.CompilerServices (Dynamic Support)
System.Diagnostics
Attributes
System.Diagnostics
System.Diagnostics.CodeAnalysis
System.Runtime.CompilerServices
- AsyncIteratorStateMachine
- AsyncMethodBuilder
- CallerArgumentExpression
- CallerFilePath
- CallerLineNumber
- CallerMemberName
- CollectionBuilder
- CompilerFeatureRequired
- EnumeratorCancellation
- Extension
- InlineArray
- InterpolatedStringHandler
- InterpolatedStringHandlerArgument
- ModuleInitializer
- OverloadResolutionPriority
- RefSafetyRules
- RequiredMember
- RequiresLocation
- SkipLocalsInit
- TupleElementNames
System.Runtime.InteropServices
Delegates
Static Methods
System.Array
System.BitConverter
- bool TryWriteBytes(Span<byte> destination, int value)
- bool TryWriteBytes(Span<byte> destination, long value)
- bool TryWriteBytes(Span<byte> destination, short value)
- bool TryWriteBytes(Span<byte> destination, float value)
- bool TryWriteBytes(Span<byte> destination, double value)
System.Char
- bool IsAscii(char c)
- bool IsAsciiDigit(char c)
- bool IsAsciiLetter(char c)
- bool IsAsciiLetterLower(char c)
- bool IsAsciiLetterUpper(char c)
- bool IsAsciiHexDigit(char c)
- bool IsAsciiHexDigitLower(char c)
- bool IsAsciiHexDigitUpper(char c)
System.Buffers.Text.Base64
System.Collections.ObjectModel.ReadOnlyCollection<T>
- ReadOnlyCollection<T> Empty (static property)
System.Collections.ObjectModel.ReadOnlyDictionary<TKey,TValue>
- ReadOnlyDictionary<TKey,TValue> Empty (static property)
System.Convert
- string ToHexString(byte[] inArray)
- string ToHexString(byte[] inArray, int offset, int length)
- string ToHexString(ReadOnlySpan<byte> bytes)
- byte[] FromHexString(string s)
- byte[] FromHexString(ReadOnlySpan<char> chars)
System.Guid
- Guid CreateVersion7()
- Guid CreateVersion7(DateTimeOffset timestamp)
- bool TryParse(ReadOnlySpan<char> input, out Guid result)
- Guid Parse(ReadOnlySpan<char> input)
System.IO.File
- IEnumerable<string> ReadLines(string path)
- IEnumerable<string> ReadLines(string path, Encoding encoding)
- Task<byte[]> ReadAllBytesAsync(string path, CancellationToken cancellationToken = default)
- Task<string> ReadAllTextAsync(string path, CancellationToken cancellationToken = default)
- Task<string> ReadAllTextAsync(string path, Encoding encoding, CancellationToken cancellationToken = default)
- Task<string[]> ReadAllLinesAsync(string path, CancellationToken cancellationToken = default)
- Task<string[]> ReadAllLinesAsync(string path, Encoding encoding, CancellationToken cancellationToken = default)
- Task WriteAllBytesAsync(string path, byte[] bytes, CancellationToken cancellationToken = default)
- Task WriteAllTextAsync(string path, string? contents, CancellationToken cancellationToken = default)
- Task WriteAllTextAsync(string path, string? contents, Encoding encoding, CancellationToken cancellationToken = default)
- Task WriteAllLinesAsync(string path, IEnumerable<string> contents, CancellationToken cancellationToken = default)
- Task WriteAllLinesAsync(string path, IEnumerable<string> contents, Encoding encoding, CancellationToken cancellationToken = default)
System.IO.Path
- string Join(string path1, string path2)
- string Join(string path1, string path2, string path3)
- string Join(string path1, string path2, string path3, string path4)
- string Join(params string[] paths)
- string Combine(string path1, string path2, string path3)
- string Combine(string path1, string path2, string path3, string path4)
- string Combine(params string[] paths)
- string GetRelativePath(string relativeTo, string path)
- bool Exists(string? path)
- bool EndsInDirectorySeparator(string? path)
- bool EndsInDirectorySeparator(ReadOnlySpan<char> path)
- string TrimEndingDirectorySeparator(string? path)
- ReadOnlySpan<char> TrimEndingDirectorySeparator(ReadOnlySpan<char> path)
System.Math
- T Clamp(T value, T min, T max) - for byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal
- double BitDecrement(double x)
- double BitIncrement(double x)
- double CopySign(double x, double y)
- double FusedMultiplyAdd(double x, double y, double z)
- double ScaleB(double x, int n)
- int ILogB(double x)
- double ReciprocalEstimate(double x)
- double ReciprocalSqrtEstimate(double x)
- double Asinh(double x)
- double Acosh(double x)
- double Atanh(double x)
- double Cbrt(double x)
- Int128 BigMul(long a, long b)
- UInt128 BigMul(ulong a, ulong b)
System.MathF
- float BitDecrement(float x)
- float BitIncrement(float x)
- float CopySign(float x, float y)
- float FusedMultiplyAdd(float x, float y, float z)
- int ILogB(float x)
- float MaxMagnitude(float x, float y)
- float MinMagnitude(float x, float y)
- float ReciprocalEstimate(float x)
- float ReciprocalSqrtEstimate(float x)
- float ScaleB(float x, int n)
- float Asinh(float x)
- float Acosh(float x)
- float Atanh(float x)
- float Cbrt(float x)
System.DateTime
- DateTime UnixEpoch
- DateTime Parse
- DateTime ParseExact
- bool TryParse
- bool TryParseExact
- DateTime FromDateAndTime
System.Single (float)
- bool IsFinite
- bool IsNegative
- bool IsNormal
- bool IsSubnormal
- float Lerp
- float DegreesToRadians
- float RadiansToDegrees
System.Double (double)
- bool IsFinite
- bool IsNegative
- bool IsNormal
- bool IsSubnormal
System.Random
- Random Shared (static property)
System.Security.Cryptography.RandomNumberGenerator
System.Security.Cryptography.SHA256
- byte[] HashData(byte[] source)
- byte[] HashData(ReadOnlySpan<byte> source)
- int HashData(ReadOnlySpan<byte> source, Span<byte> destination)
- bool TryHashData(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten)
System.Security.Cryptography.SHA512
- byte[] HashData(byte[] source)
- byte[] HashData(ReadOnlySpan<byte> source)
- int HashData(ReadOnlySpan<byte> source, Span<byte> destination)
- bool TryHashData(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten)
System.Security.Cryptography.SHA384
- byte[] HashData(byte[] source)
- byte[] HashData(ReadOnlySpan<byte> source)
- int HashData(ReadOnlySpan<byte> source, Span<byte> destination)
- bool TryHashData(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten)
System.Security.Cryptography.SHA1
- byte[] HashData(byte[] source)
- byte[] HashData(ReadOnlySpan<byte> source)
- int HashData(ReadOnlySpan<byte> source, Span<byte> destination)
- bool TryHashData(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten)
System.Security.Cryptography.MD5
- byte[] HashData(byte[] source)
- byte[] HashData(ReadOnlySpan<byte> source)
- int HashData(ReadOnlySpan<byte> source, Span<byte> destination)
- bool TryHashData(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten)
System.TimeSpan
System.Version
System.Int32, System.Int64, System.Double, System.Decimal
System.Int32 (int)
- int Abs(int value)
- (int Quotient, int Remainder) DivRem(int left, int right)
- bool IsEvenInteger(int value)
- bool IsNegative(int value)
- bool IsOddInteger(int value)
- bool IsPositive(int value)
- int LeadingZeroCount(int value)
- int Log2(int value)
- int Max(int x, int y)
- int MaxMagnitude(int x, int y)
- int Min(int x, int y)
- int MinMagnitude(int x, int y)
- int PopCount(int value)
- int RotateLeft(int value, int rotateAmount)
- int RotateRight(int value, int rotateAmount)
- int Sign(int value)
- int TrailingZeroCount(int value)
- int Clamp(int value, int min, int max)
- int CopySign(int value, int sign)
System.Int64 (long)
- long Abs(long value)
- (long Quotient, long Remainder) DivRem(long left, long right)
- bool IsEvenInteger(long value)
- bool IsNegative(long value)
- bool IsOddInteger(long value)
- bool IsPositive(long value)
- int LeadingZeroCount(long value)
- int Log2(long value)
- long Max(long x, long y)
- long MaxMagnitude(long x, long y)
- long Min(long x, long y)
- long MinMagnitude(long x, long y)
- int PopCount(long value)
- long RotateLeft(long value, int rotateAmount)
- long RotateRight(long value, int rotateAmount)
- int Sign(long value)
- int TrailingZeroCount(long value)
- long Clamp(long value, long min, long max)
- long CopySign(long value, long sign)
System.String
- bool IsNullOrWhiteSpace(string? value)
- string Create<TState>(int length, TState state, SpanAction<char, TState> action)
- string Join(char separator, params string[] values)
- string Join<T>(char separator, IEnumerable<T> values)
- string Join(char separator, params object[] values)
- string Concat(ReadOnlySpan<char> str0, ReadOnlySpan<char> str1)
- string Concat(ReadOnlySpan<char> str0, ReadOnlySpan<char> str1, ReadOnlySpan<char> str2)
- string Concat(ReadOnlySpan<char> str0, ReadOnlySpan<char> str1, ReadOnlySpan<char> str2, ReadOnlySpan<char> str3)
System.ArgumentNullException
- void ThrowIfNull(object? argument, string? paramName = null)
- void ThrowIfNull(void* argument, string? paramName = null)
System.ArgumentException
- void ThrowIfNullOrEmpty(string? argument, string? paramName = null)
- void ThrowIfNullOrWhiteSpace(string? argument, string? paramName = null)
System.ArgumentOutOfRangeException
- void ThrowIfZero<T>(T value, string? paramName = null)
- void ThrowIfNegative<T>(T value, string? paramName = null)
- void ThrowIfNegativeOrZero<T>(T value, string? paramName = null)
- void ThrowIfGreaterThan<T>(T value, T other, string? paramName = null)
- void ThrowIfGreaterThanOrEqual<T>(T value, T other, string? paramName = null)
- void ThrowIfLessThan<T>(T value, T other, string? paramName = null)
- void ThrowIfLessThanOrEqual<T>(T value, T other, string? paramName = null)
- void ThrowIfEqual<T>(T value, T other, string? paramName = null)
- void ThrowIfNotEqual<T>(T value, T other, string? paramName = null)
System.ObjectDisposedException
System.Threading.Tasks.ParallelAsync
- Task ForAsync(int fromInclusive, int toExclusive, Func<int, CancellationToken, ValueTask> body)
- Task ForAsync(int fromInclusive, int toExclusive, ParallelOptions parallelOptions, Func<int, CancellationToken, ValueTask> body)
- Task ForAsync(long fromInclusive, long toExclusive, Func<long, CancellationToken, ValueTask> body)
- Task ForAsync(long fromInclusive, long toExclusive, ParallelOptions parallelOptions, Func<long, CancellationToken, ValueTask> body)
- Task ForEachAsync<TSource>(IEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask> body)
- Task ForEachAsync<TSource>(IEnumerable<TSource> source, ParallelOptions parallelOptions, Func<TSource, CancellationToken, ValueTask> body)
- Task ForEachAsync<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask> body)
- Task ForEachAsync<TSource>(IAsyncEnumerable<TSource> source, ParallelOptions parallelOptions, Func<TSource, CancellationToken, ValueTask> body)
System.Threading.Interlocked
- int And(ref int location1, int value)
- long And(ref long location1, long value)
- uint And(ref uint location1, uint value)
- ulong And(ref ulong location1, ulong value)
- int Or(ref int location1, int value)
- long Or(ref long location1, long value)
- uint Or(ref uint location1, uint value)
- ulong Or(ref ulong location1, ulong value)
System.OperatingSystem
- bool IsAndroid()
- bool IsAndroidVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0)
- bool IsBrowser()
- bool IsFreeBSD()
- bool IsFreeBSDVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0)
- bool IsIOS()
- bool IsIOSVersionAtLeast(int major, int minor = 0, int build = 0)
- bool IsLinux()
- bool IsMacCatalyst()
- bool IsMacCatalystVersionAtLeast(int major, int minor = 0, int build = 0)
- bool IsMacOS()
- bool IsMacOSVersionAtLeast(int major, int minor = 0, int build = 0)
- bool IsOSPlatform(string platform)
- bool IsOSPlatformVersionAtLeast(string platform, int major, int minor = 0, int build = 0, int revision = 0)
- bool IsTvOS()
- bool IsTvOSVersionAtLeast(int major, int minor = 0, int build = 0)
- bool IsWasi()
- bool IsWatchOS()
- bool IsWatchOSVersionAtLeast(int major, int minor = 0, int build = 0)
- bool IsWindows()
- bool IsWindowsVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0)
System.Threading.Tasks.Task
- Task CompletedTask (static property)
- Task Delay(int millisecondsDelay)
- Task Delay(TimeSpan delay)
- Task Delay(int millisecondsDelay, CancellationToken cancellationToken)
- Task Delay(TimeSpan delay, CancellationToken cancellationToken)
- Task FromCanceled(CancellationToken cancellationToken)
- Task<TResult> FromCanceled<TResult>(CancellationToken cancellationToken)
- Task FromException(Exception exception)
- Task<TResult> FromException<TResult>(Exception exception)
- IAsyncEnumerable<Task<TResult>> WhenEach<TResult>(params Task<TResult>[] tasks)
- YieldAwaitable Yield()
Methods
System.Array
- Span<T> AsSpan<T>(this T[] @this)
- Span<T> AsSpan<T>(this T[] @this, int start)
- Span<T> AsSpan<T>(this T[] @this, int start, int length)
- Span<T> AsSpan<T>(this T[] @this, Index startIndex)
- Span<T> AsSpan<T>(this T[] @this, Range range)
- Memory<T> AsMemory<T>(this T[] @this)
- Memory<T> AsMemory<T>(this T[] @this, int start)
- Memory<T> AsMemory<T>(this T[] @this, int start, int length)
- Memory<T> AsMemory<T>(this T[] @this, Index startIndex)
- Memory<T> AsMemory<T>(this T[] @this, Range range)
System.ReadOnlySpan
- bool SequenceEqual<T>(this Span<T> span, ReadOnlySpan<T> other)
- bool SequenceEqual<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> other)
- bool SequenceEqual<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> other, IEqualityComparer<T> comparer)
- int IndexOf<T>(this ReadOnlySpan<T> span, T value)
- int IndexOf<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> value)
- int IndexOf(this ReadOnlySpan<char> span, ReadOnlySpan<char> value, StringComparison comparisonType)
- int LastIndexOf<T>(this ReadOnlySpan<T> span, T value)
- int LastIndexOf<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> value)
- int LastIndexOf(this ReadOnlySpan<char> span, ReadOnlySpan<char> value, StringComparison comparisonType)
- bool StartsWith(this ReadOnlySpan<char> span, ReadOnlySpan<char> value, StringComparison comparisonType)
- bool StartsWith<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> value)
- bool StartsWith<T>(this Span<T> span, ReadOnlySpan<T> value)
- int Count<T>(this Span<T> span, T value)
- int Count<T>(this ReadOnlySpan<T> span, T value)
- void Sort<T>(Span<T> span)
- void Sort<T>(Span<T> span, Comparison<T> comparison)
- void Sort<T, TComparer>(Span<T> span, TComparer comparer)
- void Sort<TKey, TValue>(Span<TKey> keys, Span<TValue> items)
- void Sort<TKey, TValue>(Span<TKey> keys, Span<TValue> items, Comparison<TKey> comparison)
- void Sort<TKey, TValue, TComparer>(Span<TKey> keys, Span<TValue> items, TComparer comparer)
- void Reverse<T>(Span<T> span)
- int CommonPrefixLength<T>(this Span<T> span, ReadOnlySpan<T> other)
- int CommonPrefixLength<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> other)
- int CommonPrefixLength<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> other, IEqualityComparer<T> comparer)
System.Collections.Concurrent.ConcurrentBag
- void Clear<T>(this ConcurrentBag<T>)
System.Collections.Concurrent.ConcurrentDictionary
- TValue AddOrUpdate<TKey, TValue, TArg>(this ConcurrentDictionary<TKey, TValue> @this, TKey key, Func<TKey, TArg, TValue> addValueFactory, Func<TKey, TValue, TArg, TValue> updateValueFactory, TArg factoryArgument)
System.Collections.Concurrent.ConcurrentQueue
- void Clear<T>(this ConcurrentQueue<T>)
System.Collections.Concurrent.ConcurrentStack
- void Clear<T>(this ConcurrentStack<T>)
System.Collections.Generic.IEnumerable
System.Collections.Generic.KeyValuePair
- KeyValuePair<TKey, TValue> Create<TKey, TValue>(TKey key, TValue value)
- void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> @this, out TKey key, out TValue value)
System.Collections.Generic.Stack
- bool TryPop<TItem>(this Stack<TItem> @this, out TItem result)
- bool TryPeek<TItem>(this Stack<TItem> @this, out TItem result)
- int EnsureCapacity<T>(this Stack<T> @this, int capacity)
System.Collections.Generic.Queue
- bool TryDequeue<TItem>(this Queue<TItem> @this, out TItem result)
- int EnsureCapacity<T>(this Queue<T> @this, int capacity)
- bool TryPeek<TItem>(this Queue<TItem> @this, out TItem result)
System.Collections.Generic.Dictionary
- int EnsureCapacity<TKey, TValue>(this Dictionary<TKey, TValue> @this, int capacity)
- TValue? GetValueOrDefault<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> @this, TKey key)
- TValue GetValueOrDefault<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> @this, TKey key, TValue defaultValue)
- bool TryAdd<TKey, TValue>(this Dictionary<TKey, TValue> @this, TKey key, TValue value)
System.Collections.Generic.HashSet
- int EnsureCapacity<T>(this HashSet<T> @this, int capacity)
- bool TryGetValue<T>(this HashSet<T> @this, T equalValue, out T actualValue)
System.Collections.Generic.SortedSet
- bool TryGetValue<T>(this SortedSet<T> @this, T equalValue, out T actualValue)
System.Collections.Generic.List
- List<T> Slice<T>(this List<T> @this, int start, int length)
- int EnsureCapacity<T>(this List<T> @this, int capacity)
System.Collections.Generic.CollectionExtensions
- ReadOnlyCollection<T> AsReadOnly<T>(this IList<T> list)
- ReadOnlyDictionary<TKey, TValue> AsReadOnly<TKey, TValue>(this IDictionary<TKey, TValue> dictionary)
System.DateTime
- int Microsecond(this DateTime @this)
- int Nanosecond(this DateTime @this)
- DateTime AddMicroseconds(this DateTime @this, double value)
- bool TryFormat(this DateTime @this, Span<char> destination, out int charsWritten, ...)
- void Deconstruct(this DateTime @this, out DateOnly date, out TimeOnly time)
- void Deconstruct(this DateTime @this, out int year, out int month, out int day)
System.DateTimeOffset
- long ToUnixTimeMilliseconds(this DateTimeOffset @this)
- long ToUnixTimeSeconds(this DateTimeOffset @this)
System.Diagnostics.Stopwatch
- void Restart(this Stopwatch @this)
- TimeSpan GetElapsedTime(long startingTimestamp)
- TimeSpan GetElapsedTime(long startingTimestamp, long endingTimestamp)
- string ToString(this Stopwatch @this)
System.Environment
- long TickCount64
- int ProcessId
- string? ProcessPath
- int CurrentManagedThreadId
- bool IsPrivilegedProcess
System.GC
- T[] AllocateArray<T>(int length, bool pinned = false)
- T[] AllocateUninitializedArray<T>(int length, bool pinned = false)
System.Globalization.CompareInfo
- int GetHashCode(this CompareInfo @this, string source, CompareOptions options)
System.Guid
- bool TryWriteBytes(this Guid @this, Span<byte> destination)
System.Enum
System.IO.DirectoryInfo
- IEnumerable<FileSystemInfo> EnumerateFileSystemInfos(this DirectoryInfo @this)
- IEnumerable<FileInfo> EnumerateFiles(this DirectoryInfo @this)
- IEnumerable<DirectoryInfo> EnumerateDirectories(this DirectoryInfo @this)
- IEnumerable<FileInfo> EnumerateFiles(this DirectoryInfo @this, string searchPattern, SearchOption searchOption)
- IEnumerable<DirectoryInfo> EnumerateDirectories(this DirectoryInfo @this, string searchPattern, SearchOption searchOption)
System.IO.FileInfo
- void MoveTo(this FileInfo @this, string destFileName, bool overwrite)
System.IO.BinaryReader
- byte[] ReadExactly(this BinaryReader @this, int count)
- void ReadExactly(this BinaryReader @this, Span<byte> buffer)
System.IO.Stream
- void CopyTo(this Stream @this, Stream target)
- void Flush(this Stream @this, bool flushToDisk)
- Task<int> ReadAsync(this Stream @this, byte[] buffer, int offset, int count)
- Task<int> ReadAsync(this Stream @this, byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- Task WriteAsync(this Stream @this, byte[] buffer, int offset, int count)
- Task WriteAsync(this Stream @this, byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- Task CopyToAsync(this Stream @this, Stream destination, int bufferSize, CancellationToken cancellationToken)
- int Read(this Stream @this, Span<byte> buffer)
- void Write(this Stream @this, ReadOnlySpan<byte> buffer)
- void ReadExactly(this Stream @this, byte[] buffer, int offset, int count)
- void ReadExactly(this Stream @this, Span<byte> buffer)
- int ReadAtLeast(this Stream @this, Span<byte> buffer, int minimumBytes, bool throwOnEndOfStream = true)
- ValueTask<int> ReadAsync(this Stream @this, Memory<byte> buffer, CancellationToken cancellationToken = default)
- ValueTask WriteAsync(this Stream @this, ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default)
- ValueTask ReadExactlyAsync(this Stream @this, byte[] buffer, int offset, int count, CancellationToken cancellationToken = default)
- ValueTask ReadExactlyAsync(this Stream @this, Memory<byte> buffer, CancellationToken cancellationToken = default)
System.IO.TextWriter
- void Write(this TextWriter @this, ReadOnlySpan<char> buffer)
- void WriteLine(this TextWriter @this, ReadOnlySpan<char> buffer)
- Task WriteAsync(this TextWriter @this, string? value)
- Task WriteAsync(this TextWriter @this, char value)
- Task WriteAsync(this TextWriter @this, char[] buffer, int index, int count)
- Task WriteLineAsync(this TextWriter @this)
- Task WriteLineAsync(this TextWriter @this, string? value)
- Task WriteLineAsync(this TextWriter @this, char value)
- Task WriteLineAsync(this TextWriter @this, char[] buffer, int index, int count)
- Task FlushAsync(this TextWriter @this)
System.IO.TextReader
- int Read(this TextReader @this, Span<char> buffer)
- Task<string?> ReadLineAsync(this TextReader @this)
- Task<string> ReadToEndAsync(this TextReader @this)
- Task<int> ReadAsync(this TextReader @this, char[] buffer, int index, int count)
- Task<int> ReadBlockAsync(this TextReader @this, char[] buffer, int index, int count)
System.IO.Directory
- DirectoryInfo CreateTempSubdirectory(string? prefix = null)
System.Type
- Type[] GenericTypeArguments { get; }
- bool IsAssignableTo(this Type @this, Type? targetType)
System.Text.Encoding
- bool TryGetBytes(this Encoding @this, ReadOnlySpan<char> chars, Span<byte> bytes, out int bytesWritten)
- bool TryGetChars(this Encoding @this, ReadOnlySpan<byte> bytes, Span<char> chars, out int charsWritten)
System.Text.StringBuilder
- StringBuilder Append(this StringBuilder @this, ReadOnlySpan<char> value)
- StringBuilder AppendJoin(this StringBuilder @this, string separator, params object[] values)
- StringBuilder AppendJoin(this StringBuilder @this, string separator, params string[] values)
- StringBuilder AppendJoin(this StringBuilder @this, char separator, params object[] values)
- StringBuilder AppendJoin(this StringBuilder @this, char separator, params string[] values)
- ChunkEnumerator GetChunks(this StringBuilder @this)
- StringBuilder Insert(this StringBuilder @this, int index, ReadOnlySpan<char> value)
System.Linq
- TResult[] ToArray<TResult>(this IEnumerable<TResult> @this)
- List<TResult> ToList<TResult>(this IEnumerable<TResult> @this)
- ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> @this, Func<TSource, TKey> keySelector)
- ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> @this, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
- IEnumerable<TResult> Cast<TResult>(this IEnumerable @this)
- IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> @this, Func<TSource, int, bool> predicate)
- IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> @this, Func<TSource, TResult> selector)
- IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> @this, Func<TSource, int, TResult> selector)
- IEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> @this, Func<TSource, TKey> keySelector)
- IEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> @this, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
- IEnumerable<TSource> ThenBy<TSource, TKey>(this IEnumerable<TSource> @this, Func<TSource, TKey> keySelector)
- IEnumerable<TSource> ThenBy<TSource, TKey>(this IEnumerable<TSource> @this, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
- TSource First<TSource>(this IEnumerable<TSource> @this)
- TSource First<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- TSource FirstOrDefault<TSource>(this IEnumerable<TSource> @this)
- TSource FirstOrDefault<TSource>(this IEnumerable<TSource> @this, TSource defaultValue)
- TSource FirstOrDefault<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- TSource FirstOrDefault<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate, TSource defaultValue)
- TSource Single<TSource>(this IEnumerable<TSource> @this)
- TSource Single<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- TSource SingleOrDefault<TSource>(this IEnumerable<TSource> @this)
- TSource SingleOrDefault<TSource>(this IEnumerable<TSource> @this, TSource defaultValue)
- TSource SingleOrDefault<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate, TSource defaultValue)
- TSource SingleOrDefault<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- TSource Last<TSource>(this IEnumerable<TSource> @this)
- TSource Last<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- TSource LastOrDefault<TSource>(this IEnumerable<TSource> @this)
- TSource LastOrDefault<TSource>(this IEnumerable<TSource> @this, TSource defaultValue)
- TSource LastOrDefault<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- TSource LastOrDefault<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate, TSource defaultValue)
- TSource Min<TSource>(this IEnumerable<TSource> source)
- TItem MinBy<TItem, TKey>(this IEnumerable<TItem> @this, Func<TItem, TKey> keySelector)
- TItem MinBy<TItem, TKey>(this IEnumerable<TItem> @this, Func<TItem, TKey> keySelector, IComparer<TKey> comparer)
- TSource Max<TSource>(this IEnumerable<TSource> source)
- bool Any<TSource>(this IEnumerable<TSource> @this)
- bool Any<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- bool All<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- int Count<TSource>(this IEnumerable<TSource> @this)
- int Count<TSource>(this IEnumerable<TSource> @this, Func<TSource, bool> predicate)
- TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> @this, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func)
- TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> @this, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector)
- TSource Aggregate<TSource>(this IEnumerable<TSource> @this, Func<TSource, TSource, TSource> func)
- TItem MaxBy<TItem, TKey>(this IEnumerable<TItem> @this, Func<TItem, TKey> keySelector)
- TItem MaxBy<TItem, TKey>(this IEnumerable<TItem> @this, Func<TItem, TKey> keySelector, IComparer<TKey> comparer)
- IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
- IEnumerable<TItem> Prepend<TItem>(this IEnumerable<TItem> @this, TItem item)
- IEnumerable<TItem> Append<TItem>(this IEnumerable<TItem> @this, TItem item)
- bool TryGetNonEnumeratedCount<TItem>(this IEnumerable<TItem> source, out int count)
- IEnumerable<TItem> Zip<TFirst, TSecond, TResult>(IEnumerable<TFirst> @this, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
- IEnumerable<TSource[]> Chunk<TSource>(this IEnumerable<TSource> source, int size)
- IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
- IEnumerable<TSource> ExceptBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector)
- IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector)
- IEnumerable<TSource> UnionBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TKey> keySelector)
- IOrderedEnumerable<T> Order<T>(this IEnumerable<T> source)
- IOrderedEnumerable<T> OrderDescending<T>(this IEnumerable<T> source)
- IEnumerable<(int Index, TSource Item)> Index<TSource>(this IEnumerable<TSource> source)
- IEnumerable<KeyValuePair<TKey, int>> CountBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
- IEnumerable<KeyValuePair<TKey, TAccumulate>> AggregateBy<TSource, TKey, TAccumulate>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, TAccumulate> seed, Func<TAccumulate, TSource, TAccumulate> func)
- IEnumerable<TSource> Shuffle<TSource>(this IEnumerable<TSource> source)
- IEnumerable<TResult> LeftJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector)
- IEnumerable<TResult> RightJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector)
- IEnumerable<TSource> Reverse<TSource>(this TSource[] source)
- IEnumerable<T> Sequence<T>(T start, T endInclusive, T step)
- IEnumerable<T> InfiniteSequence<T>(T start, T step)
- IEnumerable<TSource> TakeLast<TSource>(this IEnumerable<TSource> source, int count)
- IEnumerable<TSource> SkipLast<TSource>(this IEnumerable<TSource> source, int count)
System.Delegate
- MethodInfo GetMethodInfo(this Delegate @this)
System.Random
- long NextInt64(this Random @this)
- long NextInt64(this Random @this, long maxValue)
- long NextInt64(this Random @this, long minValue, long maxValue)
- float NextSingle(this Random @this)
- void NextBytes(this Random @this, Span<byte> buffer)
- T[] GetItems<T>(this Random @this, T[] choices, int length)
- void GetItems<T>(this Random @this, ReadOnlySpan<T> choices, Span<T> destination)
- void Shuffle<T>(this Random @this, T[] values)
- void Shuffle<T>(this Random @this, Span<T> values)
- string GetHexString(this Random @this, int length, bool lowercase = false)
- void GetHexString(this Random @this, Span<char> destination, bool lowercase = false)
- string GetString(this Random @this, ReadOnlySpan<char> choices, int length)
System.Reflection.Assembly
- Attribute GetCustomAttribute(this Assembly element, Type attributeType)
- T GetCustomAttribute<T>(this Assembly element)
- IEnumerable<Attribute> GetCustomAttributes(this Assembly element)
- IEnumerable<Attribute> GetCustomAttributes(this Assembly element, Type attributeType)
- IEnumerable<T> GetCustomAttributes<T>(this Assembly element)
- bool IsDefined(this Assembly element, Type attributeType)
System.Reflection.Module
- Attribute GetCustomAttribute(this Module element, Type attributeType)
- T GetCustomAttribute<T>(this Module element)
- IEnumerable<Attribute> GetCustomAttributes(this Module element)
- IEnumerable<Attribute> GetCustomAttributes(this Module element, Type attributeType)
- IEnumerable<T> GetCustomAttributes<T>(this Module element)
- bool IsDefined(this Module element, Type attributeType)
System.Reflection.MemberInfo
- Attribute GetCustomAttribute(this MemberInfo element, Type attributeType)
- Attribute GetCustomAttribute(this MemberInfo element, Type attributeType, bool inherit)
- T GetCustomAttribute<T>(this MemberInfo element)
- T GetCustomAttribute<T>(this MemberInfo element, bool inherit)
- IEnumerable<Attribute> GetCustomAttributes(this MemberInfo element)
- IEnumerable<Attribute> GetCustomAttributes(this MemberInfo element, bool inherit)
- IEnumerable<Attribute> GetCustomAttributes(this MemberInfo element, Type attributeType)
- IEnumerable<Attribute> GetCustomAttributes(this MemberInfo element, Type attributeType, bool inherit)
- IEnumerable<T> GetCustomAttributes<T>(this MemberInfo element)
- IEnumerable<T> GetCustomAttributes<T>(this MemberInfo element, bool inherit)
- bool IsDefined(this MemberInfo element, Type attributeType)
- bool IsDefined(this MemberInfo element, Type attributeType, bool inherit)
System.Reflection.ParameterInfo
- Attribute GetCustomAttribute(this ParameterInfo element, Type attributeType)
- Attribute GetCustomAttribute(this ParameterInfo element, Type attributeType, bool inherit)
- T GetCustomAttribute<T>(this ParameterInfo element)
- T GetCustomAttribute<T>(this ParameterInfo element, bool inherit)
- IEnumerable<Attribute> GetCustomAttributes(this ParameterInfo element)
- IEnumerable<Attribute> GetCustomAttributes(this ParameterInfo element, bool inherit)
- IEnumerable<Attribute> GetCustomAttributes(this ParameterInfo element, Type attributeType)
- IEnumerable<Attribute> GetCustomAttributes(this ParameterInfo element, Type attributeType, bool inherit)
- IEnumerable<T> GetCustomAttributes<T>(this ParameterInfo element)
- IEnumerable<T> GetCustomAttributes<T>(this ParameterInfo element, bool inherit)
- bool IsDefined(this ParameterInfo element, Type attributeType)
- bool IsDefined(this ParameterInfo element, Type attributeType, bool inherit)
System.Reflection.MethodInfo
- Delegate CreateDelegate(this MethodInfo @this, Type result)
System.Reflection.PropertyInfo
System.String
- int GetHashCode(this string @this, StringComparison comparisonType)
- bool Contains(this string @this, string value, StringComparison comparisonType)
- bool Contains(this string @this, char value)
- bool Contains(this string @this, char value, StringComparison comparisonType)
- bool StartsWith(this string @this, char value)
- bool EndsWith(this string @this, char value)
- string Trim(this string @this, char trimChar)
- string TrimStart(this string @this, char trimChar)
- string TrimEnd(this string @this, char trimChar)
- string Replace(this string @this, string oldValue, string? newValue, StringComparison comparisonType)
- string ReplaceLineEndings(this string @this)
- string ReplaceLineEndings(this string @this, string replacementText)
- LineSplitEnumerator EnumerateLines(this string @this)
- void CopyTo(this string @this, Span<char> destination)
- bool TryCopyTo(this string @this, Span<char> destination)
- string[] Split(this string @this, char separator, StringSplitOptions options = StringSplitOptions.None)
- string[] Split(this string @this, char separator, int count, StringSplitOptions options = StringSplitOptions.None)
- string[] Split(this string @this, string separator, StringSplitOptions options = StringSplitOptions.None)
- string[] Split(this string @this, string separator, int count, StringSplitOptions options = StringSplitOptions.None)
- int IndexOf(this string @this, char value, StringComparison comparisonType)
- ReadOnlySpan<char> AsSpan(this string @this)
- ReadOnlySpan<char> AsSpan(this string @this, int start)
- ReadOnlySpan<char> AsSpan(this string @this, int start, int length)
- ReadOnlySpan<char> AsSpan(this string @this, Index startIndex)
- ReadOnlySpan<char> AsSpan(this string @this, Range range)
- ReadOnlyMemory<char> AsMemory(this string @this)
- ReadOnlyMemory<char> AsMemory(this string @this, int start)
- ReadOnlyMemory<char> AsMemory(this string @this, int start, int length)
- ReadOnlyMemory<char> AsMemory(this string @this, Index startIndex)
- ReadOnlyMemory<char> AsMemory(this string @this, Range range)
System.Type
- TypeInfo GetTypeInfo(this Type @this)
System.Numerics.Matrix3x2
- float GetElement(this Matrix3x2 @this, int row, int column)
- Matrix3x2 WithElement(this Matrix3x2 @this, int row, int column, float value)
- Vector2 GetRow(this Matrix3x2 @this, int index)
- Matrix3x2 WithRow(this Matrix3x2 @this, int index, Vector2 value)
- Vector2 (https://learn.microsoft.com/dotnet/api/system.numerics.matrix3x2.x) / Y / Z (extension properties)
- Matrix3x2 WithX(this Matrix3x2 @this, Vector2 value) / WithY / WithZ
- Matrix3x2 Create(...) - multiple overloads
System.Numerics.Matrix4x4
- Vector4 GetRow(this Matrix4x4 @this, int index)
- Matrix4x4 WithRow(this Matrix4x4 @this, int index, Vector4 value)
- Vector4 (https://learn.microsoft.com/dotnet/api/system.numerics.matrix4x4.x) / Y / Z / W (extension properties)
- Matrix4x4 WithX(this Matrix4x4 @this, Vector4 value) / WithY / WithZ / WithW
- Matrix4x4 Create(...) - multiple overloads
- Matrix4x4 CreateBillboardLeftHanded(...)
- Matrix4x4 CreateConstrainedBillboardLeftHanded(...)
- Matrix4x4 CreateLookAtLeftHanded(...)
- Matrix4x4 CreateLookToLeftHanded(...)
- Matrix4x4 CreateOrthographicLeftHanded(...)
- Matrix4x4 CreateOrthographicOffCenterLeftHanded(...)
- Matrix4x4 CreatePerspectiveLeftHanded(...)
- Matrix4x4 CreatePerspectiveFieldOfViewLeftHanded(...)
- Matrix4x4 CreatePerspectiveOffCenterLeftHanded(...)
- Matrix4x4 CreateViewportLeftHanded(...)
System.Numerics.Plane
System.Numerics.Quaternion
- Quaternion Zero (static property)
- float GetElement(this Quaternion @this, int index)
- Quaternion WithElement(this Quaternion @this, int index, float value)
- Quaternion Create(Vector3 vectorPart, float scalarPart)
- Quaternion Create(float x, float y, float z, float w)
System.RuntimeServices.CompilerServices.RuntimeHelpers
- T[] GetSubArray<T>(T[] array, Range range)
- int OffsetToStringData
System.Text.StringBuilder
- void Clear(this StringBuilder @this)
System.Threading.Tasks
- TaskAwaiter GetAwaiter(this Task task)
- TaskAwaiter<TResult> GetAwaiter<TResult>(this Task<TResult> task)
- ConfiguredTaskAwaitable ConfigureAwait(this Task task, bool continueOnCapturedContext)
- ConfiguredTaskAwaitable<TResult> ConfigureAwait<TResult>(this Task<TResult> task, bool continueOnCapturedContext)
System.Threading.CancellationTokenSource
- bool TryReset(this CancellationTokenSource @this)
- Task CancelAsync(this CancellationTokenSource @this)
- void CancelAfter(this CancellationTokenSource @this, int millisecondsDelay)
- void CancelAfter(this CancellationTokenSource @this, TimeSpan delay)
System.Threading.WaitHandle
- void Dispose(this WaitHandle @this)
System.Threading.PeriodicTimer
- TimeSpan Period (instance property)
System.Threading.Tasks.Task
System.Threading.Tasks.TaskCompletionSource
- bool TrySetCanceled<TResult>(this TaskCompletionSource<TResult> @this, CancellationToken cancellationToken)
System.Diagnostics.Process
- Task WaitForExitAsync(this Process @this, CancellationToken cancellationToken = default)
System.Text.RegularExpressions.Regex
System.Collections.Generic.List
- void AddRange<T>(this List<T> @this, ReadOnlySpan<T> source)
- void InsertRange<T>(this List<T> @this, int index, ReadOnlySpan<T> source)
- void CopyTo<T>(this List<T> @this, Span<T> destination)
- List<T> GetRange<T>(this List<T> @this, int index, int count)
System.Half
- Half Clamp(Half value, Half min, Half max)
System.Net.Http.HttpContent
- Stream ReadAsStream(this HttpContent @this)
System.Text.Json.JsonNamingPolicy
- JsonNamingPolicy SnakeCaseLower (static property)
- JsonNamingPolicy SnakeCaseUpper (static property)
- JsonNamingPolicy KebabCaseLower (static property)
- JsonNamingPolicy KebabCaseUpper (static property)
System.StringSplitOptions
- StringSplitOptions TrimEntries (constant value for frameworks without native support)
Installation
You can install the FrameworkExtensions.Backports package via NuGet Package Manager or the .NET CLI:
NuGet Package Manager
Install-Package FrameworkExtensions.Backports
.NET CLI
dotnet add package FrameworkExtensions.Backports
Build/Test Guidelines
Building
# Build for all target frameworks
dotnet build Backports/Backports.csproj
# Build for a specific target framework
dotnet build Backports/Backports.csproj -f net8.0
Testing
# Run all tests
dotnet test Backports.Tests/Backports.Tests.csproj
# Run tests for a specific framework
dotnet test Backports.Tests/Backports.Tests.csproj -f net8.0
# Run a specific test category
dotnet test --filter "Category=Unit"
Requirements
- .NET SDK 10.0+ (to build for all target frameworks)
- Visual Studio 2026 or later (recommended for multi-targeting support)
- NuGet package restore is automatic on build
Usage
Below are some examples of how to use the features provided by this package. Note that the namespaces are kept original, so no additional using directives are needed.
Range and Index
public class Program {
public static void Main() {
int[] numbers = { 1, 2, 3, 4, 5 };
var slice = numbers[1..^1];
Console.WriteLine(string.Join(", ", slice)); // Output: 2, 3, 4
}
}
Lazy Initialization
public class Program {
private static Lazy<int> lazyValue = new Lazy<int>(() => ComputeValue());
public static void Main() {
Console.WriteLine(lazyValue.Value); // Output: Computed Value
}
private static int ComputeValue() {
Console.WriteLine("Computed Value");
return 42;
}
}
LINQ Methods
using System.Collections.Generic;
using System.Linq;
public class Program {
public static void Main() {
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var max = numbers.Max();
var minBy = numbers.MinBy(n => n);
Console.WriteLine($"Max: {max}"); // Output: Max: 5
Console.WriteLine($"MinBy: {minBy}");// Output: MinBy: 1
}
}
Task Extensions
using System.Threading.Tasks;
public class Program {
public static async Task Main() {
Task task = Task.Delay(1000);
await task.ConfigureAwait(false);
Console.WriteLine("Task completed");
}
}
Expression Trees
using System;
using System.Linq.Expressions;
public class Program {
public static void Main() {
// Build an expression tree for: (x, y) => x + y
var x = Expression.Parameter(typeof(int), "x");
var y = Expression.Parameter(typeof(int), "y");
var add = Expression.Add(x, y);
var lambda = Expression.Lambda<Func<int, int, int>>(add, x, y);
// Compile and execute
var compiled = lambda.Compile();
Console.WriteLine(compiled(3, 4)); // Output: 7
// Build a conditional expression: x > 0 ? x : -x (absolute value)
var param = Expression.Parameter(typeof(int), "x");
var zero = Expression.Constant(0);
var condition = Expression.GreaterThan(param, zero);
var negate = Expression.Negate(param);
var conditional = Expression.Condition(condition, param, negate);
var absLambda = Expression.Lambda<Func<int, int>>(conditional, param);
var abs = absLambda.Compile();
Console.WriteLine(abs(-5)); // Output: 5
Console.WriteLine(abs(3)); // Output: 3
// Method call expression
var str = Expression.Parameter(typeof(string), "str");
var toUpper = Expression.Call(str, typeof(string).GetMethod("ToUpper", Type.EmptyTypes)!);
var toUpperLambda = Expression.Lambda<Func<string, string>>(toUpper, str);
var upper = toUpperLambda.Compile();
Console.WriteLine(upper("hello")); // Output: HELLO
}
}
Dynamic Language Runtime (DLR)
The Dynamic Language Runtime (DLR) provides infrastructure for dynamic languages and the dynamic keyword in C#. This polyfill enables DLR functionality for .NET 2.0 and .NET 3.5.
using System;
using System.Dynamic;
using System.Collections.Generic;
public class Program {
public static void Main() {
// ExpandoObject - dynamic property bag
dynamic expando = new ExpandoObject();
expando.Name = "John";
expando.Age = 30;
expando.Greet = (Func<string>)(() => $"Hello, I'm {expando.Name}!");
Console.WriteLine(expando.Name); // Output: John
Console.WriteLine(expando.Age); // Output: 30
Console.WriteLine(expando.Greet()); // Output: Hello, I'm John!
// Access as dictionary
var dict = (IDictionary<string, object>)expando;
dict["City"] = "New York";
Console.WriteLine(expando.City); // Output: New York
// Enumerate properties
foreach (var kvp in dict)
Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}
}
// Custom DynamicObject implementation
public class DynamicDictionary : DynamicObject {
private readonly Dictionary<string, object> _storage = new();
public override bool TryGetMember(GetMemberBinder binder, out object result) {
return _storage.TryGetValue(binder.Name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value) {
_storage[binder.Name] = value;
return true;
}
public override IEnumerable<string> GetDynamicMemberNames() => _storage.Keys;
}
The DLR polyfill for .NET 2.0/3.5 provides the core dynamic infrastructure including ExpandoObject, DynamicObject, CallSite<T>, and all binder types. On .NET 4.0+, the BCL implementation is used automatically.
Span Extensions
using System;
public class Program {
public static void Main() {
// Create a Span from an array
int[] numbers = { 1, 2, 3, 4, 5 };
Span<int> span = numbers.AsSpan();
// Slice operations
Span<int> slice = span.Slice(1, 3); // { 2, 3, 4 }
Console.WriteLine($"Slice length: {slice.Length}"); // Output: 3
// Fill and Clear
Span<int> buffer = stackalloc int[10];
buffer.Fill(42);
Console.WriteLine($"First element: {buffer[0]}"); // Output: 42
// ReadOnlySpan from string
ReadOnlySpan<char> text = "Hello World".AsSpan();
ReadOnlySpan<char> world = text.Slice(6); // "World"
Console.WriteLine(world.ToString()); // Output: World
// Sequence comparison
ReadOnlySpan<int> a = new[] { 1, 2, 3 };
ReadOnlySpan<int> b = new[] { 1, 2, 3 };
Console.WriteLine(a.SequenceEqual(b)); // Output: True
// Index and LastIndex operations
ReadOnlySpan<int> data = new[] { 1, 2, 3, 2, 1 };
Console.WriteLine(data.IndexOf(2)); // Output: 1
Console.WriteLine(data.LastIndexOf(2)); // Output: 3
}
}
Vector Extensions
using System;
using System.Numerics;
public class Program {
public static void Main() {
// Vector2 operations
Vector2 position = new Vector2(3.0f, 4.0f);
Console.WriteLine($"Length: {position.Length()}"); // Output: 5
Vector2 normalized = Vector2.Normalize(position);
Console.WriteLine($"Normalized: {normalized}"); // Output: <0.6, 0.8>
// Vector3 operations
Vector3 v1 = new Vector3(1, 0, 0);
Vector3 v2 = new Vector3(0, 1, 0);
Vector3 cross = Vector3.Cross(v1, v2);
Console.WriteLine($"Cross product: {cross}"); // Output: <0, 0, 1>
// Vector4 transformations
Vector4 point = new Vector4(1, 2, 3, 1);
Matrix4x4 scale = Matrix4x4.CreateScale(2.0f);
Vector4 transformed = Vector4.Transform(new Vector3(1, 2, 3), scale);
Console.WriteLine($"Scaled: {transformed}");
// Linear interpolation
Vector3 start = Vector3.Zero;
Vector3 end = new Vector3(10, 10, 10);
Vector3 midpoint = Vector3.Lerp(start, end, 0.5f);
Console.WriteLine($"Midpoint: {midpoint}"); // Output: <5, 5, 5>
// Matrix operations
Matrix4x4 rotation = Matrix4x4.CreateRotationZ(MathF.PI / 4); // 45 degrees
Vector4 row = rotation.GetRow(0);
Console.WriteLine($"First row: {row}");
}
}
Intrinsics Extensions
using System;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;
public class Program {
public static unsafe void Main() {
// Note: Hardware intrinsics provide SIMD operations.
// When native support is unavailable, software fallbacks are used.
// Vector128 creation and manipulation
Vector128<float> vec1 = Vector128.Create(1.0f, 2.0f, 3.0f, 4.0f);
Vector128<float> vec2 = Vector128.Create(5.0f, 6.0f, 7.0f, 8.0f);
// Element access
float first = Vector128.GetElement(vec1, 0);
Console.WriteLine($"First element: {first}"); // Output: 1
// SSE operations (with software fallback)
// Software fallback always available
if (Sse.IsSupported || true) {
Vector128<float> sum = Sse.Add(vec1, vec2);
float[] result = new float[4];
fixed (float* ptr = result)
Sse.Store(ptr, sum);
Console.WriteLine($"Sum: [{result[0]}, {result[1]}, {result[2]}, {result[3]}]");
// Output: Sum: [6, 8, 10, 12]
}
// SSE2 integer operations
Vector128<int> intVec1 = Vector128.Create(10, 20, 30, 40);
Vector128<int> intVec2 = Vector128.Create(1, 2, 3, 4);
Vector128<int> intSum = Sse2.Add(intVec1, intVec2);
// SSE41 advanced operations
float[] data = { 1.5f, 2.7f, 3.2f, 4.9f };
fixed (float* ptr = data) {
Vector128<float> loaded = Sse.LoadVector128(ptr);
Vector128<float> rounded = Sse41.Floor(loaded);
// Result: { 1.0, 2.0, 3.0, 4.0 }
}
// Dot product calculation
Vector128<float> a = Vector128.Create(1.0f, 2.0f, 3.0f, 4.0f);
Vector128<float> b = Vector128.Create(2.0f, 3.0f, 4.0f, 5.0f);
Vector128<float> dot = Sse41.DotProduct(a, b, 0xFF);
// Result contains dot product in all elements: 40 (1*2 + 2*3 + 3*4 + 4*5)
}
}
Planned Features
The goal is to make Backports compiler-complete for older targets with the same runtime functionality as modern .NET.
Test Coverage
- Add comprehensive tests for all existing polyfills
- Add tests for Memory<T>, MemoryPool<T>, ReadOnlySequence<T>, Vector128/256/512<T>
- Ensure test parity across all target frameworks (net35-net9.0)
Known Issues
- net2.0 - Unit-tested using Hawkynt's custom nUnit-Runner.
- netstandard2.0/2.1 test targets - These are API specifications, not runtimes. Tests compile but cannot execute directly; functionality is verified via compatible runtimes (netcoreapp3.1, net5.0+)
- .NET SDK 10.0 test platform - VSTest 18.x has compatibility issues with older .NET Core runtimes when running from CLI; Visual Studio Test Explorer handles this better
- TimeZoneInfo (net2.0) - Minimal stub implementation; most operations beyond
UtcandLocalthrowNotSupportedException - ExceptionDispatchInfo (pre-net4.5) - Stack trace is not fully preserved on re-throw due to framework limitations
- System.Text.Json polyfill - Subset of the full API; complex serialization scenarios may require the official NuGet package on supported frameworks
- HttpContent.ReadAsStream - Only available on .NET Core targets (not .NET Framework) as it requires the built-in System.Net.Http
Contributing
Contributions are welcome! Please follow these steps:
- Fork the repository.
- Create a new branch with a descriptive name.
- Make your changes.
- Remember: Everything public in here should polyfill existing Microsoft functionality and thus should be mentioned in the Readme with a link to its original documentation. Don't expose public members not part of Microsoft's API.
- Submit a pull request.
License
This project is licensed under the LGPL-3.0-or-later License. See the LICENSE file for details.
Alternatives
Yes, there are other polyfill libraries available for .NET. Some only fill specific gaps, while others aim to provide a more comprehensive set of backports. Some use different approaches, such as source generators or IL weaving - some are indeed very similar. Sadly some are no longer actively maintained or horribly outdated.
Here are a few notable ones:
Acknowledgments
We appreciate the contributions of the .NET community in making this package possible.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 is compatible. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net20 is compatible. net35 is compatible. net40 is compatible. net403 was computed. net45 is compatible. net451 was computed. net452 was computed. net46 is compatible. net461 is compatible. net462 is compatible. net463 was computed. net47 is compatible. net471 is compatible. net472 is compatible. net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETCoreApp 3.1
- No dependencies.
-
.NETFramework 2.0
- No dependencies.
-
.NETFramework 3.5
- No dependencies.
-
.NETFramework 4.0
- No dependencies.
-
.NETFramework 4.5
- System.Buffers (>= 4.5.1)
- System.Memory (>= 4.5.5)
- System.Numerics.Vectors (>= 4.5.0)
- System.Runtime.CompilerServices.Unsafe (>= 5.0.0)
- System.Runtime.InteropServices.RuntimeInformation (>= 4.3.0)
- System.Threading.Tasks.Extensions (>= 4.5.4)
- System.ValueTuple (>= 4.5.0)
-
.NETFramework 4.6
- System.Buffers (>= 4.5.1)
- System.Memory (>= 4.5.5)
- System.Numerics.Vectors (>= 4.5.0)
- System.Runtime.CompilerServices.Unsafe (>= 5.0.0)
- System.Runtime.InteropServices.RuntimeInformation (>= 4.3.0)
- System.Threading.Tasks.Extensions (>= 4.5.4)
- System.ValueTuple (>= 4.5.0)
-
.NETFramework 4.6.1
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.1)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.5.1)
- System.Collections.Immutable (>= 9.0.1)
- System.Memory (>= 4.5.5)
- System.Numerics.Vectors (>= 4.5.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
- System.Runtime.InteropServices.RuntimeInformation (>= 4.3.0)
- System.Threading.Tasks.Extensions (>= 4.5.4)
- System.ValueTuple (>= 4.5.0)
-
.NETFramework 4.6.2
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.1)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.5.1)
- System.Collections.Immutable (>= 9.0.1)
- System.Memory (>= 4.5.5)
- System.Numerics.Vectors (>= 4.5.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
- System.Runtime.InteropServices.RuntimeInformation (>= 4.3.0)
- System.Text.Json (>= 9.0.1)
- System.Threading.Tasks.Extensions (>= 4.5.4)
- System.ValueTuple (>= 4.5.0)
-
.NETFramework 4.7
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.1)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.5.1)
- System.Collections.Immutable (>= 9.0.1)
- System.Memory (>= 4.5.5)
- System.Numerics.Vectors (>= 4.5.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
- System.Runtime.InteropServices.RuntimeInformation (>= 4.3.0)
- System.Text.Json (>= 9.0.1)
- System.Threading.Tasks.Extensions (>= 4.5.4)
-
.NETFramework 4.7.1
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.1)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.5.1)
- System.Collections.Immutable (>= 9.0.1)
- System.Memory (>= 4.5.5)
- System.Numerics.Vectors (>= 4.5.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
- System.Runtime.InteropServices.RuntimeInformation (>= 4.3.0)
- System.Text.Json (>= 9.0.1)
- System.Threading.Tasks.Extensions (>= 4.5.4)
-
.NETFramework 4.7.2
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.1)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.5.1)
- System.Collections.Immutable (>= 9.0.1)
- System.Memory (>= 4.5.5)
- System.Numerics.Vectors (>= 4.5.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
- System.Runtime.InteropServices.RuntimeInformation (>= 4.3.0)
- System.Text.Json (>= 9.0.1)
- System.Threading.Tasks.Extensions (>= 4.5.4)
-
.NETFramework 4.8
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.1)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.5.1)
- System.Collections.Immutable (>= 9.0.1)
- System.Memory (>= 4.5.5)
- System.Numerics.Vectors (>= 4.5.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
- System.Runtime.InteropServices.RuntimeInformation (>= 4.3.0)
- System.Text.Json (>= 9.0.1)
- System.Threading.Tasks.Extensions (>= 4.5.4)
-
.NETStandard 2.0
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.1)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.5.1)
- System.Collections.Immutable (>= 9.0.1)
- System.Memory (>= 4.5.5)
- System.Numerics.Vectors (>= 4.5.0)
- System.Reflection.Emit.Lightweight (>= 4.7.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
- System.Text.Json (>= 9.0.1)
- System.Threading.Tasks.Extensions (>= 4.5.4)
-
.NETStandard 2.1
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.1)
- System.Collections.Immutable (>= 9.0.1)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
- System.Text.Json (>= 9.0.1)
-
net5.0
- No dependencies.
-
net6.0
- No dependencies.
-
net7.0
- No dependencies.
-
net8.0
- System.IO.Hashing (>= 10.0.3)
- System.Numerics.Tensors (>= 10.0.1)
-
net9.0
- System.IO.Hashing (>= 10.0.3)
- System.Numerics.Tensors (>= 10.0.1)
NuGet packages (5)
Showing the top 5 NuGet packages that depend on FrameworkExtensions.Backports:
| Package | Downloads |
|---|---|
|
FrameworkExtensions.Corlib
Extensions to the Corlib. |
|
|
FrameworkExtensions.System.Windows.Forms
Extensions to WindowsForms. |
|
|
FrameworkExtensions.PresentationCore
Extensions to WPF. |
|
|
FrameworkExtensions.System.Drawing
Extensions to System.Drawing |
|
|
FrameworkExtensions.DirectoryServices
Extensions to DirectoryServices. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0.256 | 300 | 3/2/2026 |
| 1.0.0.254 | 202 | 2/9/2026 |
| 1.0.0.250 | 191 | 2/2/2026 |
| 1.0.0.245 | 179 | 1/26/2026 |
| 1.0.0.237 | 168 | 1/19/2026 |
| 1.0.0.235 | 146 | 1/12/2026 |
| 1.0.0.231 | 183 | 1/5/2026 |
| 1.0.0.212 | 178 | 12/29/2025 |
| 1.0.0.198 | 267 | 12/22/2025 |
| 1.0.0.183 | 427 | 12/15/2025 |
| 1.0.0.167 | 499 | 11/17/2025 |
| 1.0.0.166 | 252 | 11/10/2025 |
| 1.0.0.163 | 299 | 9/29/2025 |
| 1.0.0.159 | 314 | 9/22/2025 |
| 1.0.0.158 | 313 | 9/15/2025 |
| 1.0.0.157 | 584 | 8/18/2025 |
| 1.0.0.156 | 293 | 8/4/2025 |
| 1.0.0.147 | 415 | 7/21/2025 |
| 1.0.0.142 | 1,181 | 7/7/2025 |
| 1.0.0.137 | 239 | 6/23/2025 |