Skip to main content
.NETStandard2.0

Source Generator to help multi-targeting projects.

Published
Sep 9, 2025
1y ago
Total Downloads
685.5K
685,519

Install

dotnet add package Meziantou.Polyfill --version 1.0.50
ProductVersions
.NET Standard
netstandard2.0

README

Meziantou.Polyfill

NuGet

Source Generator that adds polyfill methods and types. This helps working with multi-targeted projects.

Read more about the project: Polyfills in .NET to ease multi-targeting

Installation

dotnet add package Meziantou.Polyfill

Then, you should see the generated types in the solution explorer

Generated files in the Visual Studio's Solution Explorer

Customization

By default, all needed polyfills are generated. You can configure which polyfills should be generated by editing the .csproj file and adding the following properties:

<PropertyGroup>
  <!-- semicolon-separated or pipe-separated list of name prefix -->
  <!-- Tip: The name of the generated polyfills are available in the generated "Debug.g.cs" file -->
  <MeziantouPolyfill_IncludedPolyfills>T:Type1|T:Type2|M:Member1</MeziantouPolyfill_IncludedPolyfills>
  <MeziantouPolyfill_ExcludedPolyfills>M:System.Diagnostics.</MeziantouPolyfill_ExcludedPolyfills>

  <!-- Optional: Output the generated files to the obj\GeneratedFiles folder  -->
  <EmitCompilerGeneratedFiles>True</EmitCompilerGeneratedFiles>
  <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GeneratedFiles</CompilerGeneratedFilesOutputPath>
</PropertyGroup>

Supported polyfills

Types

  • System.Collections.Generic.PriorityQueue<TElement, TPriority>
  • System.Collections.Generic.ReferenceEqualityComparer
  • System.Diagnostics.CodeAnalysis.AllowNullAttribute
  • System.Diagnostics.CodeAnalysis.DisallowNullAttribute
  • System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute
  • System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute
  • System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute
  • System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes
  • System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute
  • System.Diagnostics.CodeAnalysis.ExperimentalAttribute
  • System.Diagnostics.CodeAnalysis.MaybeNullAttribute
  • System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute
  • System.Diagnostics.CodeAnalysis.MemberNotNullAttribute
  • System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute
  • System.Diagnostics.CodeAnalysis.NotNullAttribute
  • System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute
  • System.Diagnostics.CodeAnalysis.NotNullWhenAttribute
  • System.Diagnostics.CodeAnalysis.RequiresAssemblyFilesAttribute
  • System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute
  • System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute
  • System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute
  • System.Diagnostics.CodeAnalysis.StringSyntaxAttribute
  • System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute
  • System.Diagnostics.CodeAnalysis.UnscopedRefAttribute
  • System.Diagnostics.StackTraceHiddenAttribute
  • System.HashCode
  • System.Index
  • System.Net.Http.ReadOnlyMemoryContent
  • System.Range
  • System.Runtime.CompilerServices.AsyncMethodBuilderAttribute
  • System.Runtime.CompilerServices.CallerArgumentExpressionAttribute
  • System.Runtime.CompilerServices.CollectionBuilderAttribute
  • System.Runtime.CompilerServices.CompilerFeatureRequiredAttribute
  • System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute
  • System.Runtime.CompilerServices.InterpolatedStringHandlerArgumentAttribute
  • System.Runtime.CompilerServices.InterpolatedStringHandlerAttribute
  • System.Runtime.CompilerServices.IsExternalInit
  • System.Runtime.CompilerServices.ModuleInitializerAttribute
  • System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute
  • System.Runtime.CompilerServices.RequiredMemberAttribute
  • System.Runtime.CompilerServices.SkipLocalsInitAttribute
  • System.Runtime.CompilerServices.TupleElementNamesAttribute
  • System.Runtime.InteropServices.SuppressGCTransitionAttribute
  • System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute
  • System.Runtime.Versioning.ObsoletedOSPlatformAttribute
  • System.Runtime.Versioning.RequiresPreviewFeaturesAttribute
  • System.Runtime.Versioning.SupportedOSPlatformAttribute
  • System.Runtime.Versioning.SupportedOSPlatformGuardAttribute
  • System.Runtime.Versioning.TargetPlatformAttribute
  • System.Runtime.Versioning.UnsupportedOSPlatformAttribute
  • System.Runtime.Versioning.UnsupportedOSPlatformGuardAttribute
  • System.Threading.Lock
  • System.Threading.Tasks.TaskToAsyncResult
  • System.ValueTuple
  • System.ValueTuple
  • System.ValueTuple<T1, T2>
  • System.ValueTuple<T1, T2, T3>
  • System.ValueTuple<T1, T2, T3, T4>
  • System.ValueTuple<T1, T2, T3, T4, T5>
  • System.ValueTuple<T1, T2, T3, T4, T5, T6>
  • System.ValueTuple<T1, T2, T3, T4, T5, T6, T7>
  • System.ValueTuple<T1, T2, T3, T4, T5, T6, T7, TRest> where TRest : struct
  • System.ITupleInternal

Methods

  • System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>.GetOrAdd(TKey key, System.Func<TKey, TArg, TValue> valueFactory, TArg factoryArgument) where TArg : allows ref struct
  • System.Collections.Generic.CollectionExtensions.AsReadOnly(this System.Collections.Generic.IList list)
  • System.Collections.Generic.CollectionExtensions.AsReadOnly<TKey, TValue>(this System.Collections.Generic.IDictionary<TKey, TValue> dictionary) where TKey : notnull
  • System.Collections.Generic.CollectionExtensions.GetValueOrDefault<TKey, TValue>(this System.Collections.Generic.IReadOnlyDictionary<TKey, TValue> dictionary, TKey key)
  • System.Collections.Generic.CollectionExtensions.GetValueOrDefault<TKey, TValue>(this System.Collections.Generic.IReadOnlyDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue)
  • System.Collections.Generic.Dictionary<TKey, TValue>.Remove(TKey key, out TValue value)
  • System.Collections.Generic.KeyValuePair<TKey, TValue>.Deconstruct(out TKey key, out TValue value)
  • System.Collections.Generic.Queue.TryDequeue(out T result)
  • System.Collections.Immutable.ImmutableArray.AsSpan()
  • System.Collections.Immutable.ImmutableArray.AsSpan(System.Int32 start, System.Int32 length)
  • System.Collections.Immutable.ImmutableArray.AsSpan(System.Range range)
  • System.Diagnostics.Process.WaitForExitAsync([System.Threading.CancellationToken cancellationToken = default])
  • System.IO.Stream.Read(System.Span<System.Byte> buffer)
  • System.IO.Stream.ReadAsync(System.Memory<System.Byte> buffer, [System.Threading.CancellationToken cancellationToken = default])
  • System.IO.Stream.ReadAtLeast(System.Span<System.Byte> buffer, System.Int32 minimumBytes, [System.Boolean throwOnEndOfStream = true])
  • System.IO.Stream.ReadAtLeastAsync(System.Memory<System.Byte> buffer, System.Int32 minimumBytes, [System.Boolean throwOnEndOfStream = true], [System.Threading.CancellationToken cancellationToken = default])
  • System.IO.Stream.Write(System.ReadOnlySpan<System.Byte> buffer)
  • System.IO.Stream.WriteAsync(System.ReadOnlyMemory<System.Byte> buffer, [System.Threading.CancellationToken cancellationToken = default])
  • System.IO.StreamReader.ReadLineAsync()
  • System.IO.StreamReader.ReadLineAsync(System.Threading.CancellationToken cancellationToken)
  • System.IO.TextReader.ReadAsync(System.Memory<System.Char> buffer, [System.Threading.CancellationToken cancellationToken = default])
  • System.IO.TextReader.ReadToEndAsync(System.Threading.CancellationToken cancellationToken)
  • System.IO.TextWriter.WriteAsync(System.ReadOnlyMemory<System.Char> buffer, [System.Threading.CancellationToken cancellationToken = default])
  • System.Linq.Enumerable.AggregateBy<TSource, TKey, TAccumulate>(this System.Collections.Generic.IEnumerable source, System.Func<TSource, TKey> keySelector, System.Func<TKey, TAccumulate> seedSelector, System.Func<TAccumulate, TSource, TAccumulate> func, [System.Collections.Generic.IEqualityComparer? keyComparer = null]) where TKey : notnull
  • System.Linq.Enumerable.AggregateBy<TSource, TKey, TAccumulate>(this System.Collections.Generic.IEnumerable source, System.Func<TSource, TKey> keySelector, TAccumulate seed, System.Func<TAccumulate, TSource, TAccumulate> func, [System.Collections.Generic.IEqualityComparer? keyComparer = null]) where TKey : notnull
  • System.Linq.Enumerable.CountBy<TSource, TKey>(this System.Collections.Generic.IEnumerable source, System.Func<TSource, TKey> keySelector, [System.Collections.Generic.IEqualityComparer? keyComparer = null]) where TKey : notnull
  • System.Linq.Enumerable.DistinctBy<TSource, TKey>(this System.Collections.Generic.IEnumerable source, System.Func<TSource, TKey> keySelector)
  • System.Linq.Enumerable.DistinctBy<TSource, TKey>(this System.Collections.Generic.IEnumerable source, System.Func<TSource, TKey> keySelector, System.Collections.Generic.IEqualityComparer? comparer)
  • System.Linq.Enumerable.Index(this System.Collections.Generic.IEnumerable source)
  • System.Linq.Enumerable.IntersectBy<TSource, TKey>(this System.Collections.Generic.IEnumerable first, System.Collections.Generic.IEnumerable second, System.Func<TSource, TKey> keySelector)
  • System.Linq.Enumerable.IntersectBy<TSource, TKey>(this System.Collections.Generic.IEnumerable first, System.Collections.Generic.IEnumerable second, System.Func<TSource, TKey> keySelector, System.Collections.Generic.IEqualityComparer? comparer)
  • System.Linq.Enumerable.MaxBy<TSource, TKey>(this System.Collections.Generic.IEnumerable source, System.Func<TSource, TKey> keySelector)
  • System.Linq.Enumerable.MaxBy<TSource, TKey>(this System.Collections.Generic.IEnumerable source, System.Func<TSource, TKey> keySelector, System.Collections.Generic.IComparer? comparer)
  • System.Linq.Enumerable.MinBy<TSource, TKey>(this System.Collections.Generic.IEnumerable source, System.Func<TSource, TKey> keySelector)
  • System.Linq.Enumerable.MinBy<TSource, TKey>(this System.Collections.Generic.IEnumerable source, System.Func<TSource, TKey> keySelector, System.Collections.Generic.IComparer? comparer)
  • System.Linq.Enumerable.OrderDescending(this System.Collections.Generic.IEnumerable source)
  • System.Linq.Enumerable.OrderDescending(this System.Collections.Generic.IEnumerable source, System.Collections.Generic.IComparer? comparer)
  • System.Linq.Enumerable.Order(this System.Collections.Generic.IEnumerable source)
  • System.Linq.Enumerable.Order(this System.Collections.Generic.IEnumerable source, System.Collections.Generic.IComparer? comparer)
  • System.Linq.Enumerable.ToDictionary<TKey, TValue>(this System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<TKey, TValue>> source) where TKey : notnull
  • System.Linq.Enumerable.ToDictionary<TKey, TValue>(this System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<TKey, TValue>> source, System.Collections.Generic.IEqualityComparer? comparer) where TKey : notnull
  • System.Linq.Enumerable.ToHashSet(this System.Collections.Generic.IEnumerable source)
  • System.Linq.Enumerable.ToHashSet(this System.Collections.Generic.IEnumerable source, System.Collections.Generic.IEqualityComparer? comparer)
  • System.Linq.Enumerable.UnionBy<TSource, TKey>(this System.Collections.Generic.IEnumerable first, System.Collections.Generic.IEnumerable second, System.Func<TSource, TKey> keySelector)
  • System.Linq.Enumerable.UnionBy<TSource, TKey>(this System.Collections.Generic.IEnumerable first, System.Collections.Generic.IEnumerable second, System.Func<TSource, TKey> keySelector, System.Collections.Generic.IEqualityComparer? comparer)
  • System.Linq.Enumerable.Zip<TFirst, TSecond>(this System.Collections.Generic.IEnumerable first, System.Collections.Generic.IEnumerable second)
  • System.MemoryExtensions.AsSpan(this System.String? text, System.Int32 start, System.Int32 length)
  • System.MemoryExtensions.CommonPrefixLength(this System.ReadOnlySpan span, System.ReadOnlySpan other)
  • System.MemoryExtensions.CommonPrefixLength(this System.ReadOnlySpan span, System.ReadOnlySpan other, System.Collections.Generic.IEqualityComparer? comparer)
  • System.MemoryExtensions.CommonPrefixLength(this System.Span span, System.ReadOnlySpan other)
  • System.MemoryExtensions.CommonPrefixLength(this System.Span span, System.ReadOnlySpan other, System.Collections.Generic.IEqualityComparer? comparer)
  • System.MemoryExtensions.ContainsAnyExcept(this System.ReadOnlySpan span, System.ReadOnlySpan values) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAnyExcept(this System.ReadOnlySpan span, T value) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAnyExcept(this System.ReadOnlySpan span, T value0, T value1) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAnyExcept(this System.ReadOnlySpan span, T value0, T value1, T value2) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAnyExcept(this System.Span span, System.ReadOnlySpan values) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAnyExcept(this System.Span span, T value) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAnyExcept(this System.Span span, T value0, T value1) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAnyExcept(this System.Span span, T value0, T value1, T value2) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAny(this System.Span span, System.ReadOnlySpan values) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAny(this System.Span span, T value0, T value1) where T : System.IEquatable?
  • System.MemoryExtensions.ContainsAny(this System.Span span, T value0, T value1, T value2) where T : System.IEquatable?
  • System.MemoryExtensions.Contains(this System.ReadOnlySpan span, T value) where T : System.IEquatable?
  • System.MemoryExtensions.Contains(this System.Span span, T value) where T : System.IEquatable?
  • System.MemoryExtensions.IndexOfAnyExcept(this System.ReadOnlySpan span, System.ReadOnlySpan values) where T : System.IEquatable?
  • System.MemoryExtensions.IndexOfAnyExcept(this System.ReadOnlySpan span, T value) where T : System.IEquatable?
  • System.MemoryExtensions.IndexOfAnyExcept(this System.ReadOnlySpan span, T value0, T value1) where T : System.IEquatable?
  • System.MemoryExtensions.IndexOfAnyExcept(this System.ReadOnlySpan span, T value0, T value1, T value2) where T : System.IEquatable?
  • System.MemoryExtensions.IndexOfAnyExcept(this System.Span span, System.ReadOnlySpan values) where T : System.IEquatable?
  • System.MemoryExtensions.IndexOfAnyExcept(this System.Span span, T value) where T : System.IEquatable?
  • System.MemoryExtensions.IndexOfAnyExcept(this System.Span span, T value0, T value1) where T : System.IEquatable?
  • System.MemoryExtensions.IndexOfAnyExcept(this System.Span span, T value0, T value1, T value2) where T : System.IEquatable?
  • System.Net.Http.HttpContent.CopyTo(System.IO.Stream stream, System.Net.TransportContext? context, System.Threading.CancellationToken cancellationToken)
  • System.Net.Http.HttpContent.CopyToAsync(System.IO.Stream stream)
  • System.Net.Http.HttpContent.CopyToAsync(System.IO.Stream stream, System.Net.TransportContext? context)
  • System.Net.Http.HttpContent.CopyToAsync(System.IO.Stream stream, System.Net.TransportContext? context, System.Threading.CancellationToken cancellationToken)
  • System.Net.Http.HttpContent.CopyToAsync(System.IO.Stream stream, System.Threading.CancellationToken cancellationToken)
  • System.Net.Http.HttpContent.ReadAsStream(System.Threading.CancellationToken cancellationToken)
  • System.Net.Http.HttpContent.ReadAsStream()
  • System.Net.Http.HttpContent.ReadAsStringAsync(System.Threading.CancellationToken cancellationToken)
  • System.Net.Sockets.UdpClient.Send(System.ReadOnlySpan<System.Byte> datagram, System.Net.IPEndPoint? endPoint)
  • System.Net.Sockets.UdpClient.Send(System.ReadOnlySpan<System.Byte> datagram, System.String? hostname, System.Int32 port)
  • System.Net.Sockets.UdpClient.SendAsync(System.ReadOnlyMemory<System.Byte> datagram, System.Net.IPEndPoint? endPoint, [System.Threading.CancellationToken cancellationToken = default])
  • System.Net.Sockets.UdpClient.SendAsync(System.ReadOnlyMemory<System.Byte> datagram, System.String? hostname, System.Int32 port, [System.Threading.CancellationToken cancellationToken = default])
  • System.Net.Sockets.UdpClient.SendAsync(System.ReadOnlyMemory<System.Byte> datagram, [System.Threading.CancellationToken cancellationToken = default])
  • System.String.Contains(System.Char value)
  • System.String.Contains(System.Char value, System.StringComparison comparisonType)
  • System.String.Contains(System.String value, System.StringComparison comparisonType)
  • System.String.CopyTo(System.Span<System.Char> destination)
  • System.String.EndsWith(System.Char value)
  • System.String.GetHashCode(System.StringComparison comparisonType)
  • System.String.IndexOf(System.Char value, System.StringComparison comparisonType)
  • System.String.Replace(System.String oldValue, System.String? newValue, System.StringComparison comparisonType)
  • System.String.ReplaceLineEndings(System.String replacementText)
  • System.String.ReplaceLineEndings()
  • System.String.Split(System.Char separator, System.Int32 count, [System.StringSplitOptions options = System.StringSplitOptions.None])
  • System.String.Split(System.Char separator, [System.StringSplitOptions options = System.StringSplitOptions.None])
  • System.String.StartsWith(System.Char value)
  • System.String.TryCopyTo(System.Span<System.Char> destination)
  • System.Text.Encoding.GetString(System.ReadOnlySpan<System.Byte> bytes)
  • System.Text.StringBuilder.Append(System.ReadOnlyMemory<System.Char> value)
  • System.Text.StringBuilder.Append(System.ReadOnlySpan<System.Char> value)
  • System.Text.StringBuilder.AppendJoin(System.Char separator, params System.Object?[] values)
  • System.Text.StringBuilder.AppendJoin(System.Char separator, params System.String?[] values)
  • System.Text.StringBuilder.AppendJoin(System.String? separator, params System.Object?[] values)
  • System.Text.StringBuilder.AppendJoin(System.String? separator, params System.String?[] values)
  • System.Text.StringBuilder.AppendJoin(System.Char separator, System.Collections.Generic.IEnumerable values)
  • System.Text.StringBuilder.AppendJoin(System.String? separator, System.Collections.Generic.IEnumerable values)
  • System.Text.StringBuilder.Replace(System.ReadOnlySpan<System.Char> oldValue, System.ReadOnlySpan<System.Char> newValue)
  • System.Text.StringBuilder.Replace(System.ReadOnlySpan<System.Char> oldValue, System.ReadOnlySpan<System.Char> newValue, System.Int32 startIndex, System.Int32 count)
  • System.Threading.CancellationTokenSource.CancelAsync()
  • System.Threading.Tasks.Task.WaitAsync(System.Threading.CancellationToken cancellationToken)
  • System.Threading.Tasks.TaskAsyncEnumerableExtensions.ToBlockingEnumerable(this System.Collections.Generic.IAsyncEnumerable source, [System.Threading.CancellationToken cancellationToken = default])
  • System.TimeSpan.Multiply(System.Double factor)
  • System.Type.IsAssignableTo(System.Type? targetType)

Contribution

How to add a new polyfill
  • Create a new file named .cs in the project Meziantou.Polyfill.Editor
  • Run Meziantou.Polyfill.Generator

Notes:

  • All files must be self contained. Use a file class if needed.
  • If you need to generate a file only when another polyfill is generated, add // when in the file

Changes from Previous Version

No structural changes between v1.0.49 and v1.0.50.

Adoption Assessment

A verified publisher signal is available. Assess fit from the package's supported frameworks, license and dependency graph rather than popularity alone.

Compatibility metadata lists 1 target framework; confirm the exact target used by your application.

Related Guides & Workflows

Learn how to evaluate, integrate, or audit this package in your .NET project.