SlideShare a Scribd company logo
Blazor WebAssembly と
Windows Forms での
ロジック共有例
2021-09-25 .NETラボ 勉強会 2021年9月
太田 浩一(@koudenpa)
目次
• 自己・ネタ紹介
• .NETのランタイム
• 実際の共有例
自己・ネタ紹介
自己紹介
• 太田浩一
• @koudenpa Twitterなど https://twitter.com/koudenpa
• @7474 GitHubなど https://github.com/7474
• 株式会社はてな
• Webアプリケーションエンジニア
• 月並みですがエンジニア募集中
• https://hatenacorp.jp/recruit
• 仕事
• Perl、TypeScript、Go、YAML、HCL、AWS辺りが主
• C#、Azureはあんまり
.NET
• 趣味でやってる
• たまにAzure周りの勉強会をふらついたり
• 今回のネタも趣味のもの
• Visual Studioで快適に開発できるのが好き
ネタ紹介
• Blazor WebAssemblyとWindows Formsでロジックを共有
• Blazor WebAssembly
• Webブラウザで動く
• Windows Forms
• Windowsのデスクトップで動く
• まぁまぁ違う実行環境
• どっちも(概ね)同じDLL
Windows Forms
• ランタイムの図を貼る
• -> しっくりくるのが無かった……
• だいたいこんな感じのはず
Windows OS
Windows Forms
Application
.NET 5 Runtime
Blazor WebAssembly
• https://docs.microsoft.com/ja-jp/dotnet/architecture/blazor-for-web-
forms-developers/hosting-models
ネタ
• まぁまぁ違う実行環境
• ロジック共有の理屈と例
.NETのランタイム
免責
• ふんわり理解
• なので間違ってたりしたらコメントなどで補完してください
.NETのメインストリーム
• .NET Framework 4.8, .NET Core 3.1 -> .NET 5 -> .NET 6 …
.NET
Framework 4.8
.NET Core 3.1 .NET 5 .NET 6
.NET Core 1.0
.NET
Framework 1.0
.NETのメインストリーム
• 古くからのWindowsでは.NET Framework
• これまでのマルチプラットフォームは.NET Core
• 今後は.NET 5~と考えておけばいい
• これが普段見かける.NET
• この実装とは別に仕様がある
.NETの仕様
• .NET Standard
• https://dotnet.microsoft.com/platform/dotnet-standard
• .NETの実装の共通の仕様
• 先の.NET FrameorkもCoreも.NET 5~もこれを実装している
様々なランタイム
様々なランタイム
• この辺りの情報はいろんなところに書いてある
• https://docs.microsoft.com/ja-jp/dotnet/standard/net-standard
• https://docs.microsoft.com/ja-jp/dotnet/core/introduction
今回話題にするもののランタイム
• Windows Forms
• .NET 5(のWindows版)
• Blazor WebAssembly
• ???
• 先の図に載っていない
Blazor WebAssembly
• https://docs.microsoft.com/ja-
jp/aspnet/core/blazor/?view=aspnetcore-5.0#code-sharing-and-net-
standard
Blazor WebAssembly
• .NET Standard を実装していることに変わりないらしい
共有できるロジックを書くには?
• .NET Standard を対象にすればいいらしい
• ターゲットフレームワーク
メジャーなライブラリの依存関係
• NET Standardの、いずれかのバージョンになっている事が多い
• はず
• NuGetパッケージの依存関係を見てみる
Newtonsoft.Json
• .NET Standard以前をサポート
• 複雑すぎた
昨今はここだけでOK
• > 最も広く使用されているライブ
ラリは、最終的に .NET
Standard 2.0 と .NET 5 の両方
のマルチターゲットになりま
す。 .NET Standard 2.0 をサ
ポートすると、最大のリーチに
なります。
まとめると
• https://docs.microsoft.com/ja-jp/dotnet/standard/net-standard#net-
5-and-net-standard
• 先の引用もここ
• 色々なランタイムでロジック共有を必要としない場合
• 実行に使うランタイム(今後は.NET 5~)をターゲットにする
• 実行時例外のリスクが低い安全な開発を行える
• 共有したい場合
• .NET Standard 2.0をターゲットにする
Blazor WebAssembly留意点
• https://docs.microsoft.com/ja-
jp/aspnet/core/blazor/?WT.mc_id=dotnet-35129-
website&view=aspnetcore-5.0#code-sharing-and-net-standard
• >Web ブラウザー内で使用できない API (たとえば、ファイル システムへのア
クセス、ソケットを開く機能、スレッドなど) からは、
PlatformNotSupportedException がスローされます。
• 大き目の制限がある
• この制限は外れることはない、はず
• ブラウザのサンドボックスで動くので
実際の共有例
ネタ
• 昔好きだったVisual Basic 5 のゲーム
• 色んなデータを読み込むもの
• GPLv3
• 動機
• Webブラウザでそのデータを見たい
• 発想
• VB->.NETコンバート
• Blazorで動かせば見られるのでは?
結果と展開
• 結果
• Blazorで動いて見られた
• 展開
• どうせならゲーム本体も移植したい
• VB5ならWindows Formsに
リポジトリなど
• https://github.com/7474/SRC
• VB5のゲーム?
• SRC(Simulation RPG Construction)
• スーパーロボット大戦のようなもの
• 色んな創作データを読み込める
• データのビューワ
• 一応動いている
• https://srcv.7474.jp/
• ゲーム自体の移植
• やってる途中
• だれてるので気合入れる意味もあってこの場でしゃべっている
ソリューション構成
• Core
• .NET Standard
• 共有対象ロジックのライブラリ
• Blazor
• .NET 5 (Blazor WebAssembly)
• Form
• .NET 5 (Windows)
• Linter
• .NET 5
• マルチプラットフォームのデータ検証アプリケーション
プロジェクト参照
• Coreライブラリ各アプリケーションから参照
• シンプル
Core
Linter
Form
Blazor
留意点
• 構成自体はシンプルだが留意点はある
• 例えばテスト、というか動作の保証?
テスト
• 趣味プロジェクトであることもあって薄くていい
• しかし、不意に動作しなくなったりするのは嫌
Blazorコンポーネントのテスト
• https://docs.microsoft.com/ja-
jp/aspnet/core/blazor/test?view=aspnetcore-5.0
• 単体テスト
• bUnit
• E2Eテスト
• Selenium など
ここでBlazor WebAssembly留意点
• C#コードとしてのテストでは保障できない部分がある
• >Web ブラウザー内で使用できない API (たとえば、ファイル システムへのア
クセス、ソケットを開く機能、スレッドなど) からは、
PlatformNotSupportedException がスローされます。
• これをフォローするにはE2Eテスト
E2Eテスト例
• テスト実行
• GitHub Actions
• PR時に実行
• ホスティング
• Azure Static Web Apps
• PR毎の環境を構築
• テストライブラリ
• Cypress
• PR毎の環境にアクセスしてテスト
• ビジュアルテスト
• Percy
• テスト時のレンダリング結果に差が無いかチェック
E2Eテスト例: GitHub Actions
• https://docs.github.com/ja/actions
• Publicリポジトリなら無償でCIし放題
• 便利
• これで動かしている
E2Eテスト例: Azure Static Web Apps
• https://docs.microsoft.com/ja-jp/azure/static-web-apps/overview
• Azureの静的サイト公開サービス
• 裏番組? のJAUGでよく見かける
• PRするとそのPRの環境が立つ
• これがお気に入り
• PR毎にE2Eテストに使える
E2Eテスト例: Cypress
• https://www.cypress.io/
• ヘッドレスブラウザを使ってWebサービスをテスト
• 同種のライブラリはいくつもあるが感触はよい
• 最低限をやっている
• ページが表示される
• スナップショットを撮る
E2Eテスト例: Percy
• https://percy.io/
• ビジュアルテストを管理してくれるサービス
• Cypressで撮ったスナップショットを比較できる
E2Eテスト例: 体験
• 最低限派手に壊れていないこと安心感
• SaaSを使えばCI構築の手間も少ない
• なかなかいい
応用
• 今回はWebAssemblyとWindows Formsだった
• 他のパターンの共有も同じ要領でできると思う
• WebAssemblyとBlazor Server
• WebAssemblyとAPIのサーバサイドロジック
• など
面白例
• 多分時間が余っているので
• いくつか面白いなと思った例を紹介
Shift_JIS
• 古いWindows向けアプリケーション
• 当然文字コードはShift_JIS
• 今どきはUTF-8が望ましく……
• .NETにはSystem.Text.Encodingがある
• 変換すればいいじゃん?
• できた
• UTF-8のページにShift_JISなファイル内容が表示されて不思議な気分
Blazor WebAssembly と Windows Forms でのロジック共有例
スマホとデスクトップの処理速度
• 同じBlazor WebAssemblyのアプリを動かす
• デスクトップの方が全然早い
• シングルスレッドっぽいしこの差は暫く埋まらなさそう
ここで処理時間を表示するようにした環境
• https://icy-coast-005428600-409.eastasia.azurestaticapps.net/titles/
~~
i7-8565U Kirin 970(少し前のハイエンド)
URLは勉強会時のものです
PRが閉じると無効になります
なお見た目が変わったのでテストが落ちる
• PR https://github.com/7474/SRC/pull/409
• 落ちたテストのページ
• 差がOKならApproveするとグリーンに
• 今回はマージしない変更なのでそのまま
まとめ
まとめ
• 今後の.NETは5, 6, 7…だが
• .NET Standardのロジックの可搬性の高さが生きる場面もある
• 非互換APIのテストは工夫したい
• 移植の余地があるプロジェクトのターゲット
• .NET 5ではなくStandardにしておく
• はまる場面もあるのではないかと思う
• Windows FormsでなくてUnityで動かすとか
終わり
• ご清聴ありがとうございました
• よいBlazor WebAssemblyライフを!

More Related Content

PDF
gRPC入門
Kenjiro Kubota
 
PPTX
テストコードの DRY と DAMP
Yusuke Kagata
 
PDF
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Platform - Japan
 
PDF
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
 
PDF
High Performance Networking with DPDK & Multi/Many Core
slankdev
 
PPTX
RPGにおけるイベント駆動型の設計と実装
Koji Morikawa
 
PDF
Go MobileでAndroidアプリ開発
Takuya Ueda
 
PDF
Pythonによる黒魔術入門
大樹 小倉
 
gRPC入門
Kenjiro Kubota
 
テストコードの DRY と DAMP
Yusuke Kagata
 
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Platform - Japan
 
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
 
High Performance Networking with DPDK & Multi/Many Core
slankdev
 
RPGにおけるイベント駆動型の設計と実装
Koji Morikawa
 
Go MobileでAndroidアプリ開発
Takuya Ueda
 
Pythonによる黒魔術入門
大樹 小倉
 

What's hot (20)

PPTX
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
 
PDF
ドメイン駆動設計 本格入門
増田 亨
 
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
 
PDF
BuildKitの概要と最近の機能
Kohei Tokunaga
 
PPTX
Rails上でのpub/sub イベントハンドラの扱い
ota42y
 
PDF
5分でわかるクリーンアーキテクチャ
Kenji Tanaka
 
PDF
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
Yoshiki Hayama
 
PPTX
(2017.6.9) Neo4jの可視化ライブラリまとめ
Mitsutoshi Kiuchi
 
PDF
RDF Semantic Graph「RDF 超入門」
オラクルエンジニア通信
 
PPTX
ゲーム仕様書の書き方 ~大久保磨編~ ver.1.2.0
Osamu Ohkubo
 
PDF
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
Masahito Zembutsu
 
PDF
アプリの鍵が消える時_Droid kaigi2018
ak_shio_555
 
PDF
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
Unity Technologies Japan K.K.
 
PDF
TLS, HTTP/2演習
shigeki_ohtsu
 
PDF
会社でClojure使ってみて分かったこと
Recruit Technologies
 
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
 
PDF
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Yuta Ohashi
 
PDF
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
 
PDF
Go入門
Takuya Ueda
 
PDF
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
 
ドメイン駆動設計 本格入門
増田 亨
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
 
BuildKitの概要と最近の機能
Kohei Tokunaga
 
Rails上でのpub/sub イベントハンドラの扱い
ota42y
 
5分でわかるクリーンアーキテクチャ
Kenji Tanaka
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
Yoshiki Hayama
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
Mitsutoshi Kiuchi
 
RDF Semantic Graph「RDF 超入門」
オラクルエンジニア通信
 
ゲーム仕様書の書き方 ~大久保磨編~ ver.1.2.0
Osamu Ohkubo
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
Masahito Zembutsu
 
アプリの鍵が消える時_Droid kaigi2018
ak_shio_555
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
Unity Technologies Japan K.K.
 
TLS, HTTP/2演習
shigeki_ohtsu
 
会社でClojure使ってみて分かったこと
Recruit Technologies
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Yuta Ohashi
 
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
 
Go入門
Takuya Ueda
 
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
Ad

Similar to Blazor WebAssembly と Windows Forms でのロジック共有例 (20)

PDF
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
Jun-ichi Sakamoto
 
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
PPTX
7 つの Blazor
m ishizaki
 
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
PPTX
Blazor でアプリを作ろう! ~テンプレートインストールから最初のデバッグ実行まで~
m ishizaki
 
PDF
New Features of DotNet 6 Blazor WASM
Shotaro Suzuki
 
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
PPTX
モノづくりBlazor勉強会1回目資料_Blazorについて.pptx
tkeproject
 
PPTX
burikaigi2023
Tatsuya Ishikawa
 
PPTX
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
Joni
 
PDF
.NET Framework アプリケーションの NET 5 への 移行を考える
Tomohiro Suzuki
 
PDF
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
Jun-ichi Sakamoto
 
PDF
Static Web AppsとBlazor WebAssemblyのすすめ
TomomitsuKusaba
 
PPTX
Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性
Yamamoto Reki
 
PDF
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
Akira Inoue
 
PDF
WebAssemblyが切り拓くフロントエンドWeb開発の未来
Jun-ichi Sakamoto
 
PDF
Developing .NET 6 Blazor WebAssemby apps with Radzen Blazor component library...
Shotaro Suzuki
 
PPTX
Blazor Web Assembly (C#) を触ってみた
Naito Oshima
 
PDF
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
Jun-ichi Sakamoto
 
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
Jun-ichi Sakamoto
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
7 つの Blazor
m ishizaki
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
Blazor でアプリを作ろう! ~テンプレートインストールから最初のデバッグ実行まで~
m ishizaki
 
New Features of DotNet 6 Blazor WASM
Shotaro Suzuki
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
モノづくりBlazor勉強会1回目資料_Blazorについて.pptx
tkeproject
 
burikaigi2023
Tatsuya Ishikawa
 
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
Joni
 
.NET Framework アプリケーションの NET 5 への 移行を考える
Tomohiro Suzuki
 
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
Jun-ichi Sakamoto
 
Static Web AppsとBlazor WebAssemblyのすすめ
TomomitsuKusaba
 
Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性
Yamamoto Reki
 
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
Akira Inoue
 
WebAssemblyが切り拓くフロントエンドWeb開発の未来
Jun-ichi Sakamoto
 
Developing .NET 6 Blazor WebAssemby apps with Radzen Blazor component library...
Shotaro Suzuki
 
Blazor Web Assembly (C#) を触ってみた
Naito Oshima
 
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
Jun-ichi Sakamoto
 
Ad

More from Koichi Ota (9)

PPTX
趣味でのCosmos DBとの付き合い方
Koichi Ota
 
PPTX
祝​ Azureインテグレーションに​ App Service追加
Koichi Ota
 
PDF
チームのBIや可視化強化に Redashはどうかと 雑談した前後の話
Koichi Ota
 
PDF
カスタムNodeのススメ
Koichi Ota
 
PPTX
続・Freeプランで緩く監視させてもらってる話など
Koichi Ota
 
PPTX
ソフトウェア開発が好きだ
Koichi Ota
 
PPTX
IoT Hub と Azure Funxtions とかで片桐ヒマボタンを作った話
Koichi Ota
 
PPTX
Raspberry pi は raspbian だけのものじゃない
Koichi Ota
 
PPTX
My First Monitoring With Mackerel
Koichi Ota
 
趣味でのCosmos DBとの付き合い方
Koichi Ota
 
祝​ Azureインテグレーションに​ App Service追加
Koichi Ota
 
チームのBIや可視化強化に Redashはどうかと 雑談した前後の話
Koichi Ota
 
カスタムNodeのススメ
Koichi Ota
 
続・Freeプランで緩く監視させてもらってる話など
Koichi Ota
 
ソフトウェア開発が好きだ
Koichi Ota
 
IoT Hub と Azure Funxtions とかで片桐ヒマボタンを作った話
Koichi Ota
 
Raspberry pi は raspbian だけのものじゃない
Koichi Ota
 
My First Monitoring With Mackerel
Koichi Ota
 

Blazor WebAssembly と Windows Forms でのロジック共有例

Editor's Notes

  • #20: メモ.NET 5 https://docs.microsoft.com/ja-jp/aspnet/core/blazor/?view=aspnetcore-5.0 https://docs.microsoft.com/ja-jp/aspnet/core/blazor/hosting-models?view=aspnetcore-5.0 https://docs.microsoft.com/ja-jp/aspnet/core/blazor/?view=aspnetcore-5.0 https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor