Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native...
Search
neno
September 19, 2026
Technology
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~
C# Kaigi 2026
の登壇資料
GitHub:
cloudflare-workers-dotnet
neno
September 19, 2026
More Decks by neno
See All by neno
大 AI 時代におけるC# の事情 ~ぶっちゃけトークを交えながら~
nenonaninu
1
960
.NET 10 のパフォーマンス改善
nenonaninu
3
7.6k
C# 14 / .NET 10 の新機能 (RC 1 時点)
nenonaninu
1
3.2k
Aspire をカスタマイズしよう & Aspire 9.2
nenonaninu
0
1.1k
分解して理解する Aspire
nenonaninu
2
3.3k
Unsafe.BitCast のすゝめ。
nenonaninu
0
440
.NET 9 のパフォーマンス改善
nenonaninu
0
4k
C# 13 / .NET 9 の新機能 (RC 1 時点)
nenonaninu
1
2.9k
Re:ゼロから始める Observability
nenonaninu
3
1.6k
Other Decks in Technology
See All in Technology
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.1k
AI de Idea
kawaguti
PRO
2
120
Issue 駆動でスペシャリストの意図を届ける、AI 実装のアクセシビリティ向上
thkt
0
120
10分で知る最近のOmarchy
komagata
0
360
Claude Codeを「使うほど育つ」AI秘書にするノウハウ
minorun365
PRO
31
26k
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
3k
積み重なった技術負債への挑戦 〜初手としての全社ゴト化〜
techtekt
PRO
0
1.3k
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
110
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
5
630
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
1
160
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
350
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
2
1.4k
Featured
See All Featured
The Language of Interfaces
destraynor
162
27k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
350
How to make the Groovebox
asonas
2
2.4k
How STYLIGHT went responsive
nonsquared
100
6.3k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
The Curse of the Amulet
leimatthew05
3
14k
From π to Pie charts
rasagy
1
370
Raft: Consensus for Rubyists
vanstee
142
7.7k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
280
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
540
Transcript
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~ C#
Kaigi 2026 2026/09/19 何縫ねの。
自己紹介 何縫ねの。 • 所属: NTTドコモビジネス株式会社 イノベーションセンター • Microsoft MVP for
Developer Technologies (2024~) • .NET / Web Development • 趣味 • C#, OSS, ドール, 一眼(α7 IV), シーシャ nenoNaninu nenoMake ブログ https://blog.neno.dev その他 https://neno.dev 1
OSS 紹介 Tapper https://github.com/nenoNaninu/Tapper • C# の型定義から TypeScript の型定義を生成する .NET
Tool/ library • JSON / MessagePack 対応! 属性を付与するだけ 2
OSS 紹介 TypedSignalR.Client https://github.com/nenoNaninu/TypedSignalR.Client • C# の SignalR Client を強く型付けするための
Source Generator こんな SignalR の Hub と Receiver の interface が あったとして… Before After (using TypedSignalR.Client) 脱文字列! 全てが強く型付け! 3
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
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
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
Cloudflare Workers とは 8
Cloudflare Workers とは Cloudflare が提供しているサーバーレスサービス • Cloudflare が所有するエッジ環境でアプリケーションが動かせる • 大きな特徴として、コンテナをホスティングに利用できない
• コンテナではなく JavaScript / WASM をホスティングする • とにかく安い!! 9
Cloudflare Workers とは Cloudflare Workers の技術的仕組み • V8 isolate で
JavaScript / WASM を動かす • V8 isolate は JavaScript を実行するための VM インスタンス V8 isolate は 複数回の request で 使い回される 10
Cloudflare Workers とは Cloudflare Workers がサポートしている言語 11
Cloudflare Workers とは Cloudflare Workers がサポートしている言語 Rust は WASM にコンパイル
12
Cloudflare Workers とは Cloudflare Workers がサポートしている言語 Python は WASM 製の
Python インタプリタ (Pyodide) で実行 Rust は WASM にコンパイル 13
Cloudflare Workers とは Cloudflare Workers がサポートしている言語 C# のサポートなし! Python は
WASM 製の Python インタプリタ (Pyodide) で実行 Rust は WASM にコンパイル 14
というわけで (?) C# で Cloudflare Workers 向け アプリケーションを書けるようにしました! 15
OSS 紹介 cloudflare-workers-dotnet https://github.com/nenoNaninu/cloudflare-workers-dotnet • C# + Minimal API スタイルで
Cloudflare Workers 向けアプリを記述可能! • パッケージ名は Cloudflare.Workers.Hosting • D1, R2, KV 等の Cloudflare サービスのバインディングも提供 16
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 17
C# と WASM の現状と Cloudflare Workers が求めるもの 18
C# と WASM の現状と Cloudflare Workers が求めるもの C# と WASM
の現状 • Blazor WASM • C# が公式に WASM を利用している唯一の実例 19
C# と WASM の現状と Cloudflare Workers が求めるもの Blazor WASM の仕組み
• WASM 製の .NET Runtime で MSIL の dll を実行 • .NET 7 まではインタプリタ • .NET 8 からは JIT コンパイルも搭載 (Jiterpreter) • 全てが JIT コンパイルされるわけではなく、基本はインタプリタ • .NET 8 以降もオプションで JIT コンパイルを切り インタプリタとして動かす事も可能 20
C# と WASM の現状と Cloudflare Workers が求めるもの WASM console app
というテンプレートが experimental で存在はする Node.js では動くが Cloudflare Workers は Node.js 環境ではないので 動くかは絶妙なところ 21
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers で求められる
WASM • JIT コンパイルが禁じられている https://developers.cloudflare.com/workers/runtime-apis/web-standards/ 22
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers で求められる
WASM • JIT コンパイルが禁じられている https://developers.cloudflare.com/workers/runtime-apis/web-standards/ JIT コンパイルは無理でも インタプリタなら 理屈上動かせるハズ…? 23
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers で求められる
WASM Instance は OK instantiate は NG 24
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers は色々制約が厳しい
https://developers.cloudflare.com/workers/platform/limits/ 25
C# と WASM の現状と Cloudflare Workers が求めるもの Cloudflare Workers は色々制約が厳しい
https://developers.cloudflare.com/workers/platform/limits/ 26
C# と WASM の現状と Cloudflare Workers が求めるもの インタプリタで大丈夫…? 27
C# と WASM の現状と Cloudflare Workers が求めるもの 否、求められているのは WASM への
NativeAOT !!! 28
C# と WASM の現状と Cloudflare Workers が求めるもの しかし公式に C# を
WASM へ NativeAOT する術はない…! 29
C# と WASM の現状と Cloudflare Workers が求めるもの 実験的プロジェクトに目を向けると… • dotnet/runtimelab
に LLVM 経由で WASM に NativeAOT する実験的プロジェクトが存在する!! • パッケージ名は Microsoft.DotNet.ILCompiler.LLVM https://github.com/dotnet/runtimelab/tree/feature/NativeAOT-LLVM 30
C# と WASM の現状と Cloudflare Workers が求めるもの 実験的プロジェクトに目を向けると… • dotnet/runtimelab
に LLVM 経由で WASM に NativeAOT する実験的プロジェクトが存在する!! • パッケージ名は Microsoft.DotNet.ILCompiler.LLVM https://github.com/dotnet/runtimelab/tree/feature/NativeAOT-LLVM 31
C# と WASM の現状と Cloudflare Workers が求めるもの Microsoft.DotNet.ILCompiler.LLVM ができる事 •
ブラウザ向け WASM に NativeAOT • Emscripten が必要 • WASI 向け WASM に NativeAOT • WASI SDK が必要 • WASI preview 2 をサポート 32
C# と WASM の現状と Cloudflare Workers が求めるもの WASI とは •
WebAssembly System Interface 略して WASI • ブラウザ環境以外でも WASM を動かすために生まれた仕様 • Cloudflare Workers は当然ブラウザ環境ではないので WASI 向けビルドを選択する事になる 33
C# と WASM の現状と Cloudflare Workers が求めるもの WASI のバージョン •
Preview 1 • Core WASM にのみ依存 • Preview 2 • WIT + Component Model に依存 • Preview 3 • 2026-06-11 に仕様がリリース • 非同期対応が主 34
C# と WASM の現状と Cloudflare Workers が求めるもの WASI のバージョン •
Preview 1 • Core WASM にのみ依存 • Preview 2 • WIT + Component Model に依存 Microsoft.DotNet.ILCompiler.LLVM が サポートしているのは Preview2 • Preview 3 • 2026-06-11 に仕様がリリース • 非同期対応が主 35
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 に仕様がリリース • 非同期対応が主 36
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 に仕様がリリース • 非同期対応が主 37
C# と WASM の現状と Cloudflare Workers が求めるもの ぐぬぬ 38
Cloudflare Workers で動く WASM にビルドする 39
Cloudflare Workers で動く WASM にビルドする 取れる選択肢 • なんとか WASI Preview
1 向けにビルドする • なんとか WASI Preview 2 向けにビルドされた WASM を V8 で動かせるようにする https://github.com/bytecodealliance/jco 40
Cloudflare Workers で動く WASM にビルドする 取れる選択肢 • なんとか WASI Preview
1 向けにビルドする • なんとか WASI Preview 2 向けにビルドされた WASM を V8 で動かせるようにする jco を使えば Preview2 の .wasm から Component Model を排除して Core WASM のみの .wasm を作れる https://github.com/bytecodealliance/jco 41
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 42
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
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
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 で動くの? 45
Cloudflare Workers で動く WASM にビルドする Preview 1 でビルドするためには? • WASM
へビルドする際には WASI SDK 同梱の clang を使う • clang を叩く際に –target で制御可能 46
Cloudflare Workers で動く WASM にビルドする Preview 1 でビルドするためには? • WASM
をビルドする際には WASI SDK 同梱の clang を使う • clang を叩く際に –target で制御可能 という事は、ビルドプロセスを定義している MSBuild のファイル内に何かあるハズ 47
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 48
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 49
Cloudflare Workers で動く WASM にビルドする ここまでで無事に WASI Preview1 向けビルドが実現 50
ライブラリの API と WASM 事情 51
ライブラリの API と WASM 事情 ライブラリが提供する API • Minimal API
スタイルにしたい 52
ライブラリの API と WASM 事情 ライブラリが提供する API • Minimal API
スタイルにしたい Top-level statement を使う以上 OutputType が Exe である必要がある 53
ライブラリの API と WASM 事情 Cloudflare Workers が HTTP リクエストの処理をキックする仕組み
• JavaScript の fetch が呼び出される • Socket で listen しているとかではない • Main で起動して動かしっぱなしにしているとかではない fetch 内で WASM の instance を立ち上げて WASM に実装されているメソッドを呼び出す https://developers.cloudflare.com/workers/runtime-apis/handlers/fetch/ 54
ライブラリの 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 55
ライブラリの 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 56
ライブラリの 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 57
ライブラリの 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 58
ライブラリの API と WASM 事情 C# の OutputType は Exe,
WASM は Reactor にしたいのですが… • できます!!! https://github.com/dotnet/runtimelab/blob/feature/NativeAOT-LLVM/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.targets 59
ライブラリの API と WASM 事情 ここまでで理想的な形で WASI Preview1 向けビルドが実現 60
WASM における Interop 事情 61
WASM における Interop 事情 最終的な JavaScript のイメージ (あくまでイメージ) 62
WASM における Interop 事情 最終的な JavaScript のイメージ (あくまでイメージ) V8 isolates
は 複数リクエストで 使い回されるので WASM の instance はキャッシュ 63
WASM における Interop 事情 最終的な JavaScript のイメージ (あくまでイメージ) V8 isolates
は 複数リクエストで 使い回されるので WASM の instance はキャッシュ リクエストを実際に処理するための WASM 側のエントリーポイント 64
WASM における Interop 事情 最終的な JavaScript のイメージ (あくまでイメージ) V8 isolates
は 複数リクエストで 使い回されるので WASM の instance はキャッシュ リクエストを実際に処理するための WASM 側のエントリーポイント どうやって C# から WASM 側に export するか? 65
WASM における Interop 事情 C# のメソッドを WASM で export する
66
WASM における Interop 事情 C# のメソッドを WASM で export する
UnmanagedCallersOnly をつける事で export 可能 67
WASM における Interop 事情 C# のメソッドを WASM で export する
引数は全て int UnmanagedCallersOnly をつける事で export 可能 68
WASM における Interop 事情 Interop どうするの? C# のメソッドを WASM で
export する 引数は全て int UnmanagedCallersOnly をつける事で export 可能 69
WASM における Interop 事情 Interop の前に WASM Core の仕様 •
4 種類の primitive type しか存在しない • i32 / i64 / f32 / f64 • WASM では Linear memory というところでメモリ管理する • Primitive type 以外は全て Linear memory を介してやりとりする必要がある 70
WASM における Interop 事情 Interop 例: JavaScript 側から文字列 (not primitive)
を取得する C# 71
WASM における Interop 事情 Interop 例: JavaScript 側から文字列 (not primitive)
を取得する C# JavaScript 72
WASM における Interop 事情 Interop 例: JavaScript 側から文字列 (not primitive)
を取得する C# instance.exports.memory.buffer が Linear memory のバッファ JavaScript 73
WASM における Interop 事情 Interop 例: JavaScript 側から文字列 (not primitive)
を取得する C# instance.exports.memory.buffer が Linear memory のバッファ JavaScript C# 側で取得したポインタがそのまま Linear memory のバッファの インデックスとなる 74
WASM における Interop 事情 C# から JavaScript のメソッドを呼ぶ C# JavaScript
75
WASM における Interop 事情 C# から JavaScript のメソッドを呼ぶ C# DllImport
+ WasmImportLinkage を設定 JavaScript 76
WASM における Interop 事情 C# から JavaScript のメソッドを呼ぶ C# DllImport
+ WasmImportLinkage を設定 JavaScript Instance を new する時に バインド先を設定する 77
非同期対応 78
非同期対応 非同期どうする? • WASM のメソッドは同期 (WASI Preview1) • C# 側では非同期を実現する必要がある
ハンドラーは当然ながら 非同期が発生する 79
非同期対応 非同期は C# (WASM) 側と JavaScript 側を行き来させる • await できるものは基本的に
JavaScript 側の Promise • WASM はシングルスレッドなので元より Task.Run とか使えない • C# 側からは Promise が完了したら呼び出される continuation を用意 • それを JavaScript 側に continuation を登録 • そして制御を JavaScript 側に戻す • JavaScript は Promise が完了したら WASM から export されているメソッドを呼び出し WASM 内で continuation を発火させる 80
非同期対応 非同期は 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 を発火させる 81
非同期対応 C# 側で Suspend が発生した時点で JavaScript 側に戻す 82
非同期対応 C# 側で Suspend が発生した時点で JavaScript 側に戻す 83
非同期対応 C# 側で Suspend が発生した時点で JavaScript 側に戻す await しない 84
非同期対応 非同期 await が生じたタイミングで continuation を用意する 85
非同期対応 非同期 await が生じたタイミングで continuation を用意する 86
非同期対応 非同期 await が生じたタイミングで continuation を用意する 87
非同期対応 非同期 await が生じたタイミングで continuation を用意する Promise を待機させる タイミングで continuationId
を発行して Promise に登録 88
非同期対応 Promise が完了した時点で C# (WASM) 側を呼び出す JavaScript C# 89
非同期対応 Promise が完了した時点で C# (WASM) 側を呼び出す JavaScript 前述の AwaitPromise で登録した
continuation を発火 C# 90
まとめ 91
まとめ cloudflare-workers-dotnet を公開しました! • C# で Cloudflare Workers 向けアプリを構築できるように!! •
最低限必要なものは一式実装済みしかし Cloudflare の膨大なサービス全てのバインドを提供するには至らず… • 流石に物量が凄い • D1 も最低限のバインディングは提供しているが全 API には至っていない • Future work • Microsoft.Extensions 系資産の統合 Interop は全て public なので ライブラリユーザが 自前実装可能なものの流石に面倒… • Future work https://github.com/nenoNaninu/cloudflare-workers-dotnet 92
cloudflare-workers-dotnet を用いて C# で Cloudflare Workers 向け アプリケーションを構築しよう! https://github.com/nenoNaninu/cloudflare-workers-dotnet