WebAssemblyを記述できるのはC/C++/Rustだけだと思っていないでしょうか。実はLLVMにさえなれば、他の言語でも記述できます。そのため、やろうと思えばSwiftから作ることもできるそうです。
そこで注目したいのがmono-wasmです。Monoを使ってC#で記述された内容を WebAssembly にするソフトウェアです。
mono-wasmの使い方
ごく簡単なコードです。コンソールを使うことでデバッグメッセージも流せます。
class Hello {static int Main(string[] args) {System.Console.WriteLine("hello world!");return 0;}}
実行結果です。
Main関数が必ず実行されるようになっていますが、他の関数を呼ばせることもできます。以下はクラスにメソッドが多数定義されている例です。
using Mono.WebAssembly;using System;class Hello{static int Factorial(int n){if (n == 0) {return 1;}return n * Factorial(n - 1);}// This function is called from the browser by JavaScript.// Here we calculate the factorial of the given number then use the// Mono.WebAssembly API to retrieve the element from the DOM and set its// innerText property to the factorial result.static void FactorialInElement(int n, string element_id){Console.WriteLine("Calculating factorial of {0} into DOM element {1}",n, element_id);int f = Factorial(n);var elem = HtmlPage.Document.GetElementById(element_id);elem.InnerText = f.ToString();}static void PrintHtmlElements(HtmlElement elem, int level){string str = "";for (int i = 0; i < level; i++) {str += " ";}str += $"<{elem.TagName}";foreach (var name in elem.AttributeNames) {var value = elem.GetAttribute(name);str += $" {name}='{value}'";}str += ">";Console.WriteLine(str);var list = elem.Children;for (int i = 0; i < list.Count; i++) {var child = list[i];PrintHtmlElements(child, level + 1);}}static int Main(string[] args){int f = Factorial(6);HtmlPage.Window.Alert($"Hello world! factorial(6) -> {f}");var bi = HtmlPage.BrowserInformation;Console.WriteLine($"BrowserInformation: Name {bi.Name} BrowserVersion {bi.BrowserVersion} UserAgent {bi.UserAgent} Platform {bi.Platform} CookiesEnabled {bi.CookiesEnabled} ProductName {bi.ProductName}");var d = HtmlPage.Document;Console.WriteLine($"Document Location: {d.Location}");PrintHtmlElements(d.DocumentElement, 0);var p = d.CreateElement("p");p.InnerText = "This text was added at runtime.";d.Body.AppendChild(p);if (args.Length > 0) FactorialInElement(0, ""); // this is a hack so that the linker does not remove the FactorialInElement() methodreturn f;}}
実行結果です。フラクタルが計算されています。DOMにメッセージを出力することもできます。
mono-wasmは単体の WebAssembly を出力しますが、同時にDLLと実行ファイルも読み込んで動作する仕組みです。そのためサイズは若干大きくなったり、読み込みに時間がかかりますが、将来的には改善予定です。C#で WebAssembly を記述する上で有望なソフトウェアです。
mono-wasmはC++製のオープンソース・ソフトウェア(MIT License)です。
MOONGIFTの関連記事
コメント