在 WASI 上執行 .NET 7 應用程式

張善友發表於2022-04-04

WASI代表 WebAssembly 系統介面,WASI 讓沙盒化的 WebAssembly 應用程式通過一系列類似 POSIX 的函式訪問底層作業系統,允許獨立於瀏覽器執行 WebAssembly 程式碼。這是一個高度實驗性的專案,但同時也是一個非常有趣的專案,並且有可能為行業的大規模程式設計正規化轉變做出貢獻,使 WebAssembly 真正無處不在。

微軟的 Steve Sanderson 最近釋出了.NET 的實驗性WASI SDK for .NET的第一個版本,它允許將 .NET 7 和 ASP.NET Core 應用程式 構建為獨立的 WASI 相容應用程式,並從 WASI 主機執行它們。Steve 的 repo 提供了在 Windows 和 Linux 上使用的簡單步驟.

我們首先要安裝 .NET 7 SDK。最新的是預覽7.0.100-preview.2並不能執行, Steve 提交了有個PR https://github.com/dotnet/aspnetcore/pull/40376 需要 7.0.100-preview.4以上版本修復,執行時方面的相關 PR 可以在https://github.com/dotnet/runtime/pull/67036 找到 ,考慮到所有因素,因為它已經修復,只是不是“正式可用”,所以最好的辦法是從每日構建版本https://github.com/dotnet/installer/blob/main/README.md#installers-and-binaries 安裝適用於對應作業系統的SDK,比如Windows的最新穩定版本是 https://aka.ms/dotnet/7.0.1xx/daily/dotnet-sdk-win-x64.exe,例如,我今天安裝的當前可用版本是7.0.100-preview.4.22201.11。

我們建立一個常規的基本 ASP.NET Core Web 應用程式。

dotnet new web

專案建立後,需要新增以下包引用才能引入實驗 Wasi.Sdk以及 Steve 構建的相應 ASP.NET Core 伺服器實現:

<ItemGroup>
    <PackageReference Include="Wasi.AspNetCore.Server.Native" Version="0.1.0" />
    <PackageReference Include="Wasi.Sdk" Version="0.1.0" />
  </ItemGroup>

除此之外,main PropertyGroup 下的一個額外屬性 ,一個與您的應用程式使用的埠 在launchSettings.json 相對應的埠:

<WasiRunnerArgs>--tcplisten localhost:5100 --env ASPNETCORE_URLS=http://localhost:5100</WasiRunnerArgs>

由於我們的應用程式需要從 WASI 主機內部偵聽網路介面,因此需要在生成的程式碼中進行額外的更改,即需要新增WasiConnectionListener() 到預設值WebApplication 構建者:

var builder = WebApplication.CreateBuilder(args).UseWasiConnectionListener();

此時應用程式將正確構建,但它還無法執行,因為我們還需要有 WASI 主機可供我們使用。

為了執行這個基於 WASI 的應用程式,我們需要一個 WASI 執行時。一個優秀的輕量級執行時是wasmtime,它恰好是這個實驗使用的那個Wasi.Sdk ,我們需要 它在 PATH 上可用。

image

我們應該能夠執行應用程式:

image

開啟瀏覽器訪問 http://localhost:5100/ ,我們現在應該在其中看到我們的 hello world。 以一種非常壯觀的方式,我們現在有一個在 WASI 執行時中作為 WebAssembly 應用程式執行的ASP.NET Core應用程式 ,並且可以從瀏覽器訪問。

image

相關文章