ランキングに戻る

Sergio0694/PolySharp

C#

PolySharp provides generated, source-only polyfills for C# language features, to easily use all runtime-agnostic features downlevel. Add a reference, set your C# version to latest and have fun! 🚀

csharpdotnetdotnet-coredotnet-frameworkdotnet-standardroslynroslyn-analyzerroslyn-generator
スター成長
スター
2.2k
フォーク
72
週間成長
Issue
30
5001k1.5k2k
2022年10月2024年1月2025年4月2026年7月
README

image
.NET NuGet NuGet

What is it? 🚀

PolySharp provides generated, source-only polyfills for C# language features, to easily use all runtime-agnostic features downlevel. The package is distributed as a source generator, so that it will automatically detect which polyfills are needed depending on the target framework and project in use: just add a reference to PolySharp, set your C# language version to latest, and have fun!

TLDR? What is this for? ✨

Put simply: are you working on .NET Framework, or UWP, or some other older .NET runtime and still would like to use all the cool new features that C# 14 has? Well this library lets you do just that! It will generate for you all the "magic types" that the C# compiler needs to "see" in order for it to allow using new language features even if you're not using the latest framework out there.

Here's an example of some of the new features that PolySharp can enable downlevel:

image

Note: not all the new C# features can be "tricked" this way (eg. those requiring runtime support, such as static abstract members, still won't work). But almost everything else will (eg. nullability annotations, pattern matching, etc.), and this applies to a big number of new C# features. Try PolySharp out, don't get stuck on C# 6.0 or other older versions! 🎉

Note: use on .NET Framework 3.5 is particularly limited due to shortcomings of the BCL there. In particular, the System.Range type will not be generated unless System.ValueTuple is referenced (meaning that eg. list patterns won't work by default), and some features such as records will not be usable at all due to the C# compiler missing some necessary APIs that cannot be polyfilled. All other features should work as expected.

Documentation 📖

PolySharp includes the following polyfills:

To leverage them, make sure to bump your C# language version. You can do this by setting the <LangVersion> MSBuild property in your project. For instance, by adding <LangVersion>14.0</LangVersion> (or your desired C# version) to the first <PropertyGroup> of your .csproj file. For more info on this, see here, but remember that you don't need to manually copy polyfills anymore: simply adding a reference to PolySharp will do this for you automatically.

It also includes the following optional runtime-supported polyfills:

  • Reflection annotation attributes (see docs):
    • [DynamicallyAccessedMembers]
    • [DynamicDependency]
    • [RequiresUnreferencedCode]
    • [RequiresDynamicCode]
    • [UnconditionalSuppressMessage]
    • [RequiresAssemblyFiles]
  • [StackTraceHidden] (see here)
  • [UnmanagedCallersOnly] (see docs)
  • Platform support annotation attributes (see docs):
    • [ObsoletedOSPlatform]
    • [SupportedOSPlatform]
    • [SupportedOSPlatformGuard]
    • [TargetPlatform]
    • [UnsupportedOSPlatform]
    • [UnsupportedOSPlatformGuard]
  • [SuppressGCTransition] (see here)
  • [DisableRuntimeMarshalling] (see here)
  • [UnsafeAccessor] (see here)
  • [InlineArray] (see here)
  • [DisableUserUnhandledExceptions] (see here)
  • Attribute model for feature switches with trimming support (see docs):
    • [FeatureGuard]
    • [FeatureSwitchDefinition]
  • [WasmImportLinkage] (see here)
  • [UnsafeAccessorType] (see here)

Options ⚙️

PolySharp's generation can be configured through some MSBuild properties to set in consuming projects.

The following properties are available:

  • "PolySharpUsePublicAccessibilityForGeneratedTypes": makes all generated types public.
  • "PolySharpUseEmbeddedAttributeForGeneratedTypes": adds the [Embedded] attributes to generated types.
  • "PolySharpIncludeRuntimeSupportedAttributes": enables polyfills for (dummy) runtime-supported attributes too.
  • "PolySharpUseInteropServices2NamespaceForUnmanagedCallersOnlyAttribute": moves [UnmanagedCallersOnly].
  • "PolySharpExcludeGeneratedTypes": excludes specific types from generation (';' or ',' separated type names).
  • "PolySharpIncludeGeneratedTypes": only includes specific types for generation (';' or ',' separated type names).
  • "PolySharpExcludeTypeForwardedToDeclarations": never generates any [TypeForwardedTo] declarations.
関連リポジトリ
jellyfin/jellyfin

The Free Software Media System - Server Backend & API

C#GNU General Public License v2.0jellyfincsharp
jellyfin.org
54.5k5.1k
files-community/Files

A modern file manager that helps users organize their files and folders.

C#MIT Licensefluent-designxaml
files.community
44.4k2.8k
ShareX/ShareX

ShareX is a free and open-source application that enables users to capture or record any area of their screen with a single keystroke. It also supports uploading images, text, and various file types to a wide range of destinations.

C#GNU General Public License v3.0screen-capturescreen-recorder
getsharex.com
38.7k3.9k
doocs/leetcode

🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解

JavaMavenCreative Commons Attribution Share Alike 4.0 Internationalalgorithmscpp
leetcode.doocs.org
36.3k9.4k
DevToys-app/DevToys

A Swiss Army knife for developers.

C#MIT Licensesyntax-highlightingdeveloper-tools
devtoys.app
31.8k1.8k
AvaloniaUI/Avalonia

Develop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The future of .NET UI

C#MIT Licensec-sharpxaml
avaloniaui.net
31.2k2.8k
microsoft/calculator

Windows Calculator: A simple yet powerful calculator that ships with Windows

C++MIT Licenseuwpwindows
31k5.8k
BeyondDimension/SteamTools

🛠「Watt Toolkit」是一个开源跨平台的多功能 Steam 工具箱。

C#GNU General Public License v3.0steamcsharp
steampp.net
26.2k1.7k
pulumi/pulumi

Pulumi - Infrastructure as Code in any programming language 🚀

GoGo ModulesApache License 2.0infrastructure-as-codeserverless
pulumi.com
25.5k1.4k
mxgmn/WaveFunctionCollapse

Bitmap & tilemap generation from a single example with the help of ideas from quantum mechanics

C#Otherprocedural-generationmachine-learning
25.2k1.3k
quozd/awesome-dotnet

A collection of awesome .NET libraries, tools, frameworks and software

Creative Commons Zero v1.0 Universaldotnetawesome
21.5k2.9k
thangchung/awesome-dotnet-core

:honeybee: A collection of awesome .NET core libraries, tools, frameworks and software

C#dotnet-coreawesome-list
21.3k3k