(aka Razor Lab, formerly also DotNetInternals)
C# and Razor compiler playground in the browser via Blazor WebAssembly. https://lab.razor.fyi/
| C# | Razor |
|---|---|
![]() |
![]() |
- Razor/CSHTML to generated C# code / IR / Syntax Tree / Errors.
- C# to IL / Syntax / IOperation / Symbols / decompiled-C# / Errors / Execution console output.
- Any Roslyn/Razor compiler version (NuGet official builds or CI builds given PR number / branch / build number).
- Offline support (PWA).
- VSCode Monaco Editor.
- Multiple input sources (especially useful for interlinked Razor components).
- C# Language Services (completions, live diagnostics, code fixes).
- Configuring any C# options (e.g., LangVersion, Features, OptimizationLevel, AllowUnsafe)
via Roslyn C# APIs or via
#:propertydirectives (both with editor completions). - Referencing NuGet packages via
#:packagedirectives.
For prerequisites, see eng/build.sh (in short: you need .NET SDK according to global.json
and workloads wasm-tools wasm-experimental).
The recommended startup app for development is src/Server.
To hit breakpoints, it is recommended to turn off the worker (in app settings).
eng/BuildTools: build-time tools.src/App: the core app.src/Compiler: self-contained project referencing Roslyn/Razor. It's reloaded at runtime with a user-chosen version of Roslyn/Razor. It should be small (for best reloading perf). It can reference shared code which does not depend on Roslyn/Razor from elsewhere (e.g.,Shared.csproj).src/RazorAccess:internalaccess to Razor DLLs (via fake assembly name).src/RoslynAccess:internalaccess to Roslyn Compiler DLLs (via fake assembly name).src/RoslynCodeStyleAccess:internalaccess to Roslyn CodeStyle DLLs (via fake assembly name).src/RoslynWorkspaceAccess:internalaccess to Roslyn Workspace DLLs (via fake assembly name).src/Server: a Blazor Server entrypoint for easier development of the App (it has better tooling support for hot reload and debugging).src/Shared: code used byCompilerthat does not depend on Roslyn/Razor.src/WebAssembly: web-assembly host of theApp(this is what's deployed online).- Trying out published version locally:
dotnet tool install -g dotnet-serve dotnet publish ./src/WebAssembly/ && dotnet serve -d ./artifacts/publish/WebAssembly/release/wwwroot/ -o -q
- Trying out published version locally:
src/Worker: a separate component that can be loaded in a web worker (a separate process in the browser), so it does all the CPU-intensive work to avoid lagging the user interface.src/WorkerApi: shared code betweenWorkerandApp. This is in preparation for making the worker independent of the app, so the app can be optimized (trimming, NativeAOT) and the worker can be loaded more lazily.src/WorkerWebAssembly: web-assembly host of theWorker.test/UnitTests
- Logo: OpenMoji
- Style: Fluent UI
- Icons: Fluent UI Icons
Razor REPLs:
- https://blazorrepl.telerik.com/
- https://netcorerepl.telerik.com/
- https://try.mudblazor.com/snippet
- https://blazorfiddle.com/
- https://try.fluentui-blazor.net/snippet
C# REPLs:
- https://dotnetfiddle.net/
- https://onecompiler.com/csharp
- https://www.programiz.com/csharp-programming/online-compiler/
C# compiler playgrounds:
XAML REPLs:
Web IDEs:

