Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~
by
neno
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~ C# Kaigi 2026 2026/09/19 何縫ねの。
Slide 2
Slide 2 text
自己紹介 何縫ねの。 • 所属: NTTドコモビジネス株式会社 イノベーションセンター • Microsoft MVP for Developer Technologies (2024~) • .NET / Web Development • 趣味 • C#, OSS, ドール, 一眼(α7 IV), シーシャ nenoNaninu nenoMake ブログ https://blog.neno.dev その他 https://neno.dev 1
Slide 3
Slide 3 text
OSS 紹介 Tapper https://github.com/nenoNaninu/Tapper • C# の型定義から TypeScript の型定義を生成する .NET Tool/ library • JSON / MessagePack 対応! 属性を付与するだけ 2
Slide 4
Slide 4 text
OSS 紹介 TypedSignalR.Client https://github.com/nenoNaninu/TypedSignalR.Client • C# の SignalR Client を強く型付けするための Source Generator こんな SignalR の Hub と Receiver の interface が あったとして… Before After (using TypedSignalR.Client) 脱文字列! 全てが強く型付け! 3
Slide 5
Slide 5 text
OSS 紹介 MessagePack Hub Protocol 対応! TypedSignalR.Client.TypeScript https://github.com/nenoNaninu/TypedSignalR.Client.TypeScript • TypeScript の SignalR Client を強く型付けするための .NET Tool / library Before 属性を付与するだけ! After (using TypedSignalR.Client.TypeScript) 脱文字列! 全てが強く型付け! TypeScript 用の型を C# から自動生成 4
Slide 6
Slide 6 text
OSS 紹介 SignalR 版 SwaggerUI TypedSignalR.Client.DevTools https://github.com/nenoNaninu/TypedSignalR.Client.DevTools • SignalR 使ったアプリを快適に開発するための GUI を自動生成する library • 2 step で利用可能! • http pipeline に middleware の追加 • Hub と Receiver を定義してる interface に属性を付与 • JWT 認証 サポート • パラメータのユーザ定義型サポート • JSON で入力! 5
Slide 7
Slide 7 text
OSS 紹介 AspNetCore.SignalR.OpenTelemetry https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry • トレースのための計装 • 最低限のログ Inspired by HttpLogging • 接続時 • Transport 層の情報も出力(WebSocket 等) • メソッド呼び出し時 • HubName.MethodName の素朴なログ • メソッド呼び出し毎にログのスコープを追加 • HubName, MethodName, InvocationId を 振っているのでログの検索性が向上 • Duration • 切断時 • 切断時に例外が発生していれば例外もログに出力 https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry SignalR のメソッド呼び出し毎に スパンが切られるように 6
Slide 8
Slide 8 text
Cloudflare Workers とは 7
Slide 9
Slide 9 text
Cloudflare Workers とは Cloudflare が提供しているサーバーレスサービス • Cloudflare が所有するエッジ環境でアプリケーションが動かせる • 大きな特徴として、コンテナをホスティングに利用できない • コンテナではなく JavaScript / WASM をホスティングする • とにかく安い!! 8
Slide 10
Slide 10 text
Cloudflare Workers とは Cloudflare Workers の技術的仕組み • V8 isolate で JavaScript / WASM を動かす • V8 isolate は JavaScript を実行するための VM インスタンス V8 isolate は 複数回の request で 使い回される 9
Slide 11
Slide 11 text
Cloudflare Workers とは Cloudflare Workers がサポートしている言語 10
Slide 12
Slide 12 text
Cloudflare Workers とは Cloudflare Workers がサポートしている言語 Rust は WASM にコンパイル 11
Slide 13
Slide 13 text
Cloudflare Workers とは Cloudflare Workers がサポートしている言語 Python は WASM 製の Python インタプリタ (Pyodide) で実行 Rust は WASM にコンパイル 12
Slide 14
Slide 14 text
Cloudflare Workers とは Cloudflare Workers がサポートしている言語 C# のサポートなし! Python は WASM 製の Python インタプリタ (Pyodide) で実行 Rust は WASM にコンパイル 13
Slide 15
Slide 15 text
というわけで (?) C# で Cloudflare Workers 向け アプリケーションを書けるようにしました! 14
Slide 16
Slide 16 text
OSS 紹介 cloudflare-workers-dotnet https://github.com/nenoNaninu/cloudflare-workers-dotnet • C# + Minimal API スタイルで Cloudflare Workers 向けアプリを記述可能! • パッケージ名は Cloudflare.Workers.Hosting • D1, R2, KV 等の Cloudflare サービスのバインディングも提供 15
Slide 17
Slide 17 text
OSS 紹介 cloudflare-workers-dotnet の使い方 • dotnet publish すると app.wasm と index.js が出力される • wrangler.jsonc を用意 • wrangler deploy で Cloudflare Workers にデプロイ完了! wrangler.jsonc https://github.com/nenoNaninu/cloudflare-workers-dotnet 16
Slide 18
Slide 18 text
C# と WASM の現状と Cloudflare Workers が求めるもの 17
Slide 19
Slide 19 text
C# と WASM の現状と Cloudflare Workers が求めるもの C# と WASM の現状 • Blazor WASM • C# が公式に WASM を利用している唯一の実例 18
Slide 20
Slide 20 text
C# と WASM の現状と Cloudflare Workers が求めるもの Blazor WASM の仕組み • WASM 製の .NET Runtime で MSIL の dll を実行 • .NET 7 まではインタプリタ • .NET 8 からは JIT コンパイルも搭載 (Jiterpreter) • 全てが JIT コンパイルされるわけではなく、基本はインタプリタ • .NET 8 以降もオプションで JIT コンパイルを切り インタプリタとして動かす事も可能 19
Slide 21
Slide 21 text
C# と WASM の現状と Cloudflare Workers が求めるもの WASM console app というテンプレートが experimental で存在はする Node.js では動くが Cloudflare Workers は Node.js 環境ではないので 動くかは絶妙なところ 20
Slide 22
Slide 22 text
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers で求められる WASM • JIT コンパイルが禁じられている https://developers.cloudflare.com/workers/runtime-apis/web-standards/ 21
Slide 23
Slide 23 text
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers で求められる WASM • JIT コンパイルが禁じられている https://developers.cloudflare.com/workers/runtime-apis/web-standards/ JIT コンパイルは無理でも インタプリタなら 理屈上動かせるハズ…? 22
Slide 24
Slide 24 text
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers で求められる WASM Instance は OK instantiate は NG 23
Slide 25
Slide 25 text
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers は色々制約が厳しい https://developers.cloudflare.com/workers/platform/limits/ 24
Slide 26
Slide 26 text
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers は色々制約が厳しい https://developers.cloudflare.com/workers/platform/limits/ 25
Slide 27
Slide 27 text
C# と WASM の現状と Cloudflare Workers が求めるもの インタプリタで大丈夫…? 26
Slide 28
Slide 28 text
C# と WASM の現状と Cloudflare Workers が求めるもの 否、求められているのは WASM への NativeAOT !!! 27
Slide 29
Slide 29 text
C# と WASM の現状と Cloudflare Workers が求めるもの しかし公式に C# を WASM へ NativeAOT する術はない…! 28
Slide 30
Slide 30 text
C# と WASM の現状と Cloudflare Workers が求めるもの 実験的プロジェクトに目を向けると… • dotnet/runtimelab に LLVM 経由で WASM に NativeAOT する実験的プロジェクトが存在する!! • パッケージ名は Microsoft.DotNet.ILCompiler.LLVM https://github.com/dotnet/runtimelab/tree/feature/NativeAOT-LLVM 29
Slide 31
Slide 31 text
C# と WASM の現状と Cloudflare Workers が求めるもの 実験的プロジェクトに目を向けると… • dotnet/runtimelab に LLVM 経由で WASM に NativeAOT する実験的プロジェクトが存在する!! • パッケージ名は Microsoft.DotNet.ILCompiler.LLVM https://github.com/dotnet/runtimelab/tree/feature/NativeAOT-LLVM 30
Slide 32
Slide 32 text
C# と WASM の現状と Cloudflare Workers が求めるもの Microsoft.DotNet.ILCompiler.LLVM ができる事 • ブラウザ向け WASM に NativeAOT • Emscripten が必要 • WASI 向け WASM に NativeAOT • WASI SDK が必要 • WASI preview 2 をサポート 31
Slide 33
Slide 33 text
C# と WASM の現状と Cloudflare Workers が求めるもの WASI とは • WebAssembly System Interface 略して WASI • ブラウザ環境以外でも WASM を動かすために生まれた仕様 • Cloudflare Workers は当然ブラウザ環境ではないので WASI 向けビルドを選択する事になる 32
Slide 34
Slide 34 text
C# と WASM の現状と Cloudflare Workers が求めるもの WASI のバージョン • Preview 1 • Core WASM にのみ依存 • Preview 2 • WIT + Component Model に依存 • Preview 3 • 2026-06-11 に仕様がリリース • 非同期対応が主 33
Slide 35
Slide 35 text
C# と WASM の現状と Cloudflare Workers が求めるもの WASI のバージョン • Preview 1 • Core WASM にのみ依存 • Preview 2 • WIT + Component Model に依存 Microsoft.DotNet.ILCompiler.LLVM が サポートしているのは Preview2 • Preview 3 • 2026-06-11 に仕様がリリース • 非同期対応が主 34
Slide 36
Slide 36 text
C# と WASM の現状と Cloudflare Workers が求めるもの WASI のバージョン • Preview 1 V8 は Core WASM にしか 対応していない • Core WASM にのみ依存 • Preview 2 • WIT + Component Model に依存 Microsoft.DotNet.ILCompiler.LLVM が サポートしているのは Preview2 • Preview 3 • 2026-06-11 に仕様がリリース • 非同期対応が主 35
Slide 37
Slide 37 text
C# と WASM の現状と Cloudflare Workers が求めるもの WASI のバージョン • Preview 1 V8 は Core WASM にしか 対応していない • Core WASM にのみ依存 • Preview 2 • WIT + Component Model に依存 故に Cloudflare Workers で 動作するのは WASI Preview1 Microsoft.DotNet.ILCompiler.LLVM が サポートしているのは Preview2 • Preview 3 • 2026-06-11 に仕様がリリース • 非同期対応が主 36
Slide 38
Slide 38 text
C# と WASM の現状と Cloudflare Workers が求めるもの ぐぬぬ 37
Slide 39
Slide 39 text
Cloudflare Workers で動く WASM にビルドする 38
Slide 40
Slide 40 text
Cloudflare Workers で動く WASM にビルドする 取れる選択肢 • なんとか WASI Preview 1 向けにビルドする • なんとか WASI Preview 2 向けにビルドされた WASM を V8 で動かせるようにする https://github.com/bytecodealliance/jco 39
Slide 41
Slide 41 text
Cloudflare Workers で動く WASM にビルドする 取れる選択肢 • なんとか WASI Preview 1 向けにビルドする • なんとか WASI Preview 2 向けにビルドされた WASM を V8 で動かせるようにする jco を使えば Preview2 の .wasm から Component Model を排除して Core WASM のみの .wasm を作れる https://github.com/bytecodealliance/jco 40
Slide 42
Slide 42 text
Cloudflare Workers で動く WASM にビルドする 取れる選択肢 • なんとか WASI Preview 1 向けにビルドする • なんとか WASI Preview 2 向けにビルドされた WASM を V8 で動かせるようにする jco を使えば Preview2 の .wasm から Component Model を排除して Core WASM のみの .wasm を作れる import を jco が自動マッピングするが Node.js 向け https://github.com/bytecodealliance/jco 41
Slide 43
Slide 43 text
Cloudflare Workers で動く WASM にビルドする 取れる選択肢 • なんとか WASI Preview 1 向けにビルドする • なんとか WASI Preview 2 向けにビルドされた WASM を V8 で動かせるようにする jco を使えば Preview2 の .wasm から Component Model を排除して Core WASM のみの .wasm を作れる import を jco が自動マッピングするが Node.js 向け https://github.com/bytecodealliance/jco Cloudflare Workers で動くの? 42
Slide 44
Slide 44 text
Cloudflare Workers で動く WASM にビルドする 取れる選択肢 • なんとか WASI Preview 1 向けにビルドする • なんとか WASI Preview 2 向けにビルドされた WASM を V8 で動かせるようにする 単純に依存を 増やす事になるので 渋い jco を使えば Preview2 の .wasm から Component Model を排除して Core WASM のみの .wasm を作れる import を jco が自動マッピングするが Node.js 向け https://github.com/bytecodealliance/jco Cloudflare Workers で動くの? 43
Slide 45
Slide 45 text
Cloudflare Workers で動く WASM にビルドする 取れる選択肢 • なんとか WASI Preview 1 向けにビルドする こちらが望ましい • なんとか WASI Preview 2 向けにビルドされた WASM を V8 で動かせるようにする 単純に依存を 増やす事になるので 渋い jco を使えば Preview2 の .wasm から Component Model を排除して Core WASM のみの .wasm を作れる import を jco が自動マッピングするが Node.js 向け https://github.com/bytecodealliance/jco Cloudflare Workers で動くの? 44
Slide 46
Slide 46 text
Cloudflare Workers で動く WASM にビルドする Preview 1 でビルドするためには? • WASM へビルドする際には WASI SDK 同梱の clang を使う • clang を叩く際に –target で制御可能 45
Slide 47
Slide 47 text
Cloudflare Workers で動く WASM にビルドする Preview 1 でビルドするためには? • WASM へビルドする際には WASI SDK 同梱の clang を使う • clang を叩く際に –target で制御可能 という事は、ビルドプロセスを定義している MSBuild のファイル内に何かあるハズ 46
Slide 48
Slide 48 text
Cloudflare Workers で動く WASM にビルドする Microsoft.DotNet.ILCompiler.LLVM のビルドプロセスに介入する • Microsoft.DotNet.ILCompiler.LLVM が定義している MSBuild の .target ファイルを眺めてみる コレ! https://github.com/dotnet/runtimelab/blob/feature/NativeAOT-LLVM/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.targets 47
Slide 49
Slide 49 text
Cloudflare Workers で動く WASM にビルドする Microsoft.DotNet.ILCompiler.LLVM のビルドプロセスに介入する • IlcLlvmTarget はビルドプロセスの途中で設定される • そのため、素朴に csproj の PropertyGroup で設定するのではなく、 IlcLlvmTarget に wasm32-unknown-wasip2 が設定された後に wasm32-unknown-wasip1 で上書きする必要がある https://github.com/nenoNaninu/cloudflare-workers-dotnet/blob/main/src/Cloudflare.Workers.Hosting/build/Cloudflare.Workers.Hosting.targets 48
Slide 50
Slide 50 text
Cloudflare Workers で動く WASM にビルドする ここまでで無事に WASI Preview1 向けビルドが実現 49
Slide 51
Slide 51 text
ライブラリの API と WASM 事情 50
Slide 52
Slide 52 text
ライブラリの API と WASM 事情 ライブラリが提供する API • Minimal API スタイルにしたい 51
Slide 53
Slide 53 text
ライブラリの API と WASM 事情 ライブラリが提供する API • Minimal API スタイルにしたい Top-level statement を使う以上 OutputType が Exe である必要がある 52
Slide 54
Slide 54 text
ライブラリの API と WASM 事情 Cloudflare Workers が HTTP リクエストの処理をキックする仕組み • JavaScript の fetch が呼び出される • Socket で listen しているとかではない • Main で起動して動かしっぱなしにしているとかではない fetch 内で WASM の instance を立ち上げて WASM に実装されているメソッドを呼び出す https://developers.cloudflare.com/workers/runtime-apis/handlers/fetch/ 53
Slide 55
Slide 55 text
ライブラリの API と WASM 事情 WASI には 2 種類ある (Preview1 の場合) • Command (exe) • _start() が export される • _start() は引数なし、返り値なし • _start() 終了後は、その instance からexport されている メソッドを叩いてはいけない • Reactor (lib) • _initialize() が export される • _initialize() を呼び出し終えたら instance から export されているメソッドを自由に叩いてよい https://github.com/WebAssembly/WASI/blob/d8b286c697364d8bc4daf1820b25a9159de364a3/design/application-abi.md 54
Slide 56
Slide 56 text
ライブラリの API と WASM 事情 WASI には 2 種類ある (Preview1 の場合) • Command (exe) • _start() が export される • _start() は引数なし、返り値なし • _start() 終了後は、その instance からexport されている メソッドを叩いてはいけない • Reactor (lib) Cloudflare Workers 的には こちらが望ましい • _initialize() が export される • _initialize() を呼び出し終えたら instance から export されているメソッドを自由に叩いてよい https://github.com/WebAssembly/WASI/blob/d8b286c697364d8bc4daf1820b25a9159de364a3/design/application-abi.md 55
Slide 57
Slide 57 text
ライブラリの API と WASM 事情 WASI には 2 種類ある (Preview1 の場合) • Command (exe) • _start() が export される • _start() は引数なし、返り値なし • _start() 終了後は、その instance からexport されている メソッドを叩いてはいけない • Reactor (lib) Cloudflare Workers 的には こちらが望ましい しかし C# 側で top-level statements 使いたい… • _initialize() が export される • _initialize() を呼び出し終えたら instance から export されているメソッドを自由に叩いてよい https://github.com/WebAssembly/WASI/blob/d8b286c697364d8bc4daf1820b25a9159de364a3/design/application-abi.md 56
Slide 58
Slide 58 text
ライブラリの API と WASM 事情 WASI には 2 種類ある (Preview1 の場合) • Command (exe) • _start() が export される • _start() は引数なし、返り値なし • _start() 終了後は、その instance からexport されている メソッドを叩いてはいけない • Reactor (lib) Cloudflare Workers 的には こちらが望ましい 加えて 非同期に 対応するには Reactor にするしかない (後述) しかし C# 側で top-level statements 使いたい… • _initialize() が export される • _initialize() を呼び出し終えたら instance から export されているメソッドを自由に叩いてよい https://github.com/WebAssembly/WASI/blob/d8b286c697364d8bc4daf1820b25a9159de364a3/design/application-abi.md 57
Slide 59
Slide 59 text
ライブラリの API と WASM 事情 C# の OutputType は Exe, WASM は Reactor にしたいのですが… • できます!!! https://github.com/dotnet/runtimelab/blob/feature/NativeAOT-LLVM/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.targets 58
Slide 60
Slide 60 text
ライブラリの API と WASM 事情 ここまでで理想的な形で WASI Preview1 向けビルドが実現 59
Slide 61
Slide 61 text
WASM における Interop 事情 60
Slide 62
Slide 62 text
WASM における Interop 事情 最終的な JavaScript のイメージ (あくまでイメージ) 61
Slide 63
Slide 63 text
WASM における Interop 事情 最終的な JavaScript のイメージ (あくまでイメージ) V8 isolates は 複数リクエストで 使い回されるので WASM の instance はキャッシュ 62
Slide 64
Slide 64 text
WASM における Interop 事情 最終的な JavaScript のイメージ (あくまでイメージ) V8 isolates は 複数リクエストで 使い回されるので WASM の instance はキャッシュ リクエストを実際に処理するための WASM 側のエントリーポイント 63
Slide 65
Slide 65 text
WASM における Interop 事情 最終的な JavaScript のイメージ (あくまでイメージ) V8 isolates は 複数リクエストで 使い回されるので WASM の instance はキャッシュ リクエストを実際に処理するための WASM 側のエントリーポイント どうやって C# から WASM 側に export するか? 64
Slide 66
Slide 66 text
WASM における Interop 事情 C# のメソッドを WASM で export する 65
Slide 67
Slide 67 text
WASM における Interop 事情 C# のメソッドを WASM で export する UnmanagedCallersOnly をつける事で export 可能 66
Slide 68
Slide 68 text
WASM における Interop 事情 C# のメソッドを WASM で export する 引数は全て int UnmanagedCallersOnly をつける事で export 可能 67
Slide 69
Slide 69 text
WASM における Interop 事情 Interop どうするの? C# のメソッドを WASM で export する 引数は全て int UnmanagedCallersOnly をつける事で export 可能 68
Slide 70
Slide 70 text
WASM における Interop 事情 Interop の前に WASM Core の仕様 • 4 種類の primitive type しか存在しない • i32 / i64 / f32 / f64 • WASM では Linear memory というところでメモリ管理する • Primitive type 以外は全て Linear memory を介してやりとりする必要がある 69
Slide 71
Slide 71 text
WASM における Interop 事情 Interop 例: JavaScript 側から文字列 (not primitive) を取得する C# 70
Slide 72
Slide 72 text
WASM における Interop 事情 Interop 例: JavaScript 側から文字列 (not primitive) を取得する C# JavaScript 71
Slide 73
Slide 73 text
WASM における Interop 事情 Interop 例: JavaScript 側から文字列 (not primitive) を取得する C# instance.exports.memory.buffer が Linear memory のバッファ JavaScript 72
Slide 74
Slide 74 text
WASM における Interop 事情 Interop 例: JavaScript 側から文字列 (not primitive) を取得する C# instance.exports.memory.buffer が Linear memory のバッファ JavaScript C# 側で取得したポインタがそのまま Linear memory のバッファの インデックスとなる 73
Slide 75
Slide 75 text
WASM における Interop 事情 C# から JavaScript のメソッドを呼ぶ C# JavaScript 74
Slide 76
Slide 76 text
WASM における Interop 事情 C# から JavaScript のメソッドを呼ぶ C# DllImport + WasmImportLinkage を設定 JavaScript 75
Slide 77
Slide 77 text
WASM における Interop 事情 C# から JavaScript のメソッドを呼ぶ C# DllImport + WasmImportLinkage を設定 JavaScript Instance を new する時に バインド先を設定する 76
Slide 78
Slide 78 text
非同期対応 77
Slide 79
Slide 79 text
非同期対応 非同期どうする? • WASM のメソッドは同期 (WASI Preview1) • C# 側では非同期を実現する必要がある ハンドラーは当然ながら 非同期が発生する 78
Slide 80
Slide 80 text
非同期対応 非同期は C# (WASM) 側と JavaScript 側を行き来させる • await できるものは基本的に JavaScript 側の Promise • WASM はシングルスレッドなので元より Task.Run とか使えない • C# 側からは Promise が完了したら呼び出される continuation を用意 • それを JavaScript 側に continuation を登録 • そして制御を JavaScript 側に戻す • JavaScript は Promise が完了したら WASM から export されているメソッドを呼び出し WASM 内で continuation を発火させる 79
Slide 81
Slide 81 text
非同期対応 非同期は C# (WASM) 側と JavaScript 側を行き来させる • await できるものは基本的に JavaScript 側の Promise • WASM はシングルスレッドなので元より Task.Run とか使えない • C# 側からは Promise が完了したら呼び出される continuation を用意 • それを JavaScript 側に continuation を登録 • そして制御を JavaScript 側に戻す C# (WASM) と JavaScript を 行き来するので Reactor である必要がある • JavaScript は Promise が完了したら WASM から export されているメソッドを呼び出し WASM 内で continuation を発火させる 80
Slide 82
Slide 82 text
非同期対応 C# 側で Suspend が発生した時点で JavaScript 側に戻す 81
Slide 83
Slide 83 text
非同期対応 C# 側で Suspend が発生した時点で JavaScript 側に戻す 82
Slide 84
Slide 84 text
非同期対応 C# 側で Suspend が発生した時点で JavaScript 側に戻す await しない 83
Slide 85
Slide 85 text
非同期対応 非同期 await が生じたタイミングで continuation を用意する 84
Slide 86
Slide 86 text
非同期対応 非同期 await が生じたタイミングで continuation を用意する 85
Slide 87
Slide 87 text
非同期対応 非同期 await が生じたタイミングで continuation を用意する 86
Slide 88
Slide 88 text
非同期対応 非同期 await が生じたタイミングで continuation を用意する Promise を待機させる タイミングで continuationId を発行して Promise に登録 87
Slide 89
Slide 89 text
非同期対応 Promise が完了した時点で C# (WASM) 側を呼び出す JavaScript C# 88
Slide 90
Slide 90 text
非同期対応 Promise が完了した時点で C# (WASM) 側を呼び出す JavaScript 前述の AwaitPromise で登録した continuation を発火 C# 89
Slide 91
Slide 91 text
まとめ 90
Slide 92
Slide 92 text
まとめ cloudflare-workers-dotnet を公開しました! • C# で Cloudflare Workers 向けアプリを構築できるように!! • 最低限必要なものは一式実装済みしかし Cloudflare の膨大なサービス全てのバインドを提供するには至らず… • 流石に物量が凄い • D1 も最低限のバインディングは提供しているが全 API には至っていない • Future work • Microsoft.Extensions 系資産の統合 Interop は全て public なので ライブラリユーザが 自前実装可能なものの流石に面倒… • Future work https://github.com/nenoNaninu/cloudflare-workers-dotnet 91
Slide 93
Slide 93 text
cloudflare-workers-dotnet を用いて C# で Cloudflare Workers 向け アプリケーションを構築しよう! https://github.com/nenoNaninu/cloudflare-workers-dotnet