Åsberg
Running C# snippets in a browser
For another I’m working on I needed a way to run small C# snippets in a web browser, and since I can’t afford fancy compiler severs I turned to WASM to do the job.
I knew about Roslyn (the compiler for C#), and knew of the existence of NuGet packages that should allow for runtime compilation and execution of C# code. So I started with trying to get custom C# code to run on the web.
WASM, and Blazor, seemed like the oblivious choice but I didn’t want to have to
write the entire project in Blazor, ideally I wanted this to be suited as an
npm
package. So I began stripping the Blazor WASM example project to see how
much I could get rid of, and as it turns out you can remove almost everything.
The only thing (aside from standard C# boilerplate) that was necessary for
Blazor to run on the web was for binding the C# WASM and the JavaScript that
initialized it together.
With that out of the way I began looking for way to communicate between JavaScript and C#. And it was easy enough, all I had to do in C# was create a static method with a special attribute and I was good to go. The JavaScript for calling that method was a bit ugly, but that’s nothing I couldn’t hide later.
So the next step was to import that Roslyn package, use it’s built in snippet
executioner (and/or REPL functionality), and all would be done. Except it wasn’t
that easy, because nothing ever is. The built in functions for running snippets
of code relied on having a filesystem where they could find the .dlls
to
compile against, something we can’t have on the web. Eventually after lots of
searching through the internet I found another, although more complicated, way
of doing it. This new way allowed me to download and keep the .dlls
in memory
until they were needed.
From here on it was mostly smooth sailing, I made a TypeScript wrapper around the clumsy JavaScript interface. Added some extra features, such as a JavaScript event when the WASM had finished loading. And finished of with a small example site, and online C# REPL, it’s super simple but it shows pretty good what this package can do.
If you’re interested in any of this take a look at: the example at
åsberg.net/browser-csharp, the
npm
package at npmjs.com/package/browser-csharp,
or the source on GitHub.com/89netraM/browser-csharp.