Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Visual Studio 2019で始める「WPF on .NET Core 3.0」開発

Visual Studio 2019で始める「WPF on .NET Core 3.0」開発

Fb7ffe21ae00b2181ed27877c92e48ca?s=128

Atsushi Nakamura

April 21, 2019
Tweet

Transcript

  1. Visual Studio 2019で始める 「WPF on .NET Core 3.0」開発 Desktop App

    Dev Strategy for .NET Core 3.0 Atsushi Nakamura
  2. Desktop App Dev Strategy for .NET Core 3.0 Overview

  3. Overview Slide 3 Copyright 2019 @nuits_jp 主に次の二つについて、お伝えしたいと思います。 1. WPFを.NET Coreで開発するモチベーション

    2. .NET Core移行の「感覚」
  4. Desktop App Dev Strategy for .NET Core 3.0 About Me

  5. About Me Copyright 2019 @nuits_jp Slide 5 中村 充志 /

    Atsushi Nakamura • リコージャパン株式会社 所属 • Enterprise(金融)系SIerのITアーキテクト • アプリケーションアーキテクチャを試行錯誤するのが趣味 • 2019年の目標 • 「世界一簡単なクリーンアーキテクチャ」で登壇したい • 「xUnit & Moqハンズオン」開催 • 「RICOH Handy Printerハンズオンとか?」やりたいな? • Blog http://www.nuits.jp • Blog(英語)https://blog.nuits.jp • Twitter @nuits_jp
  6. .NET Core 使ってますか? Copyright 2019 @nuits_jp Slide 6

  7. .NET Core 3.0でWPFを動かしてみましたか? Copyright 2019 @nuits_jp Slide 7

  8. Desktop App Dev Strategy for .NET Core 3.0 おねがい

  9. 1. デモの中でサードパーティライブラリが登場しますが、その製品に ついてはTwitterなどでの拡散は控えてください 2. 弊社の人間に、「某XXが製品コードでデモしてたよ!」と積極的に 伝えることはお控えください おねがい

  10. Desktop App Dev Strategy for .NET Core 3.0 WPFを.NET Coreで開発する「私の」モチベーションとは?

  11. WPFを.NET Coreで開発する「私の」モチベーションとは? 1. .NET Core 3.0におけるWinForms・WPFのサポート 2. 開発の中心が.NET Coreへシフト 3.

    魅力的な.NET Coreの特徴
  12. デスクトップ アプリを.NET Coreで開発するモチベーションとは? 1. .NET Core 3.0におけるWinForms・WPFのサポート 2. 開発の中心が.NET Coreへシフト

    3. 魅力的な.NET Coreの特徴
  13. • 開発の中心はすでに.NET Coreへシフト • .NET Frameworkへのポーティングは後方互換性重視 https://devblogs.microsoft.com/dotnet/announcing-net-standard-2-1/ • .NET Framework4.8は.NET

    Standard 2.0相当 • .NET Core 3.0は.NET Standard 2.1相当 • クラウドは.NET Core一択 開発の中心が.NET Coreへシフト Copyright 2019 @nuits_jp Slide 13
  14. デスクトップ アプリを.NET Coreで開発するモチベーションとは? 1. .NET Core 3.0におけるWinForms・WPFのサポート 2. 開発の中心が.NET Coreへシフト

    3. 魅力的な.NET Coreの特徴
  15. 魅力的な.NET Coreの特徴 • Side by Sideの復活 • Runtimeを同梱して配布可能(たったの60Mぽっち) • 軽快な動作速度を含む、先進的な機能の採用

    ついに.NET Framework 4.0とおさらばだ!(某金融向SIer) .NET Framework 3.5で頑張らないでいいんですね!涙(某金融向SIer) Copyright 2019 @nuits_jp Slide 15
  16. で、.NET CoreでWPFって現実的なの? Copyright 2019 @nuits_jp Slide 16

  17. Desktop App Dev Strategy for .NET Core 3.0 .NET Framework

    → .NET Core Live Migration
  18. !注意事項!

  19. 1. 本マイグレーションは、移行における「感覚」を理解しやすいと思 われる手順で実施しています 2. 実際の移行案件では以下の公式ドキュメントを参照してください • .NET Framework から .NET

    Core にコードを移植する https://docs.microsoft.com/ja-jp/dotnet/core/porting/ • WPF デスクトップ アプリを .NET Core に移植する https://docs.microsoft.com/ja-jp/dotnet/core/porting/wpf 注意事項
  20. 実業務レベルのアプリをMigration Copyright 2019 @nuits_jp Slide 20

  21. 対象アプリの特徴 • .NET Framework 4.5.2 • 大き目な.NET Framework製のサードパーティライブラリ • ビルドしたDLLの編集(静的コード生成)

    • TWAIN制御(.NET→COM→Win32 API 32bit driver) • System.Drawing.Bitmapに依存(つまりGDI+に依存) Copyright 2019 @nuits_jp Slide 21
  22. Let’s Migration! Copyright 2019 @nuits_jp Slide 22

  23. .NET Frameworkでは標準で参照できたパッケージが.NET Coreでは標 準では参照できない可能性があります。 次のいずれかで、概ね解消できます。 1. NuGetから同名のパッケージを適用する 2. Windows 互換機能パックを利用する

    https://docs.microsoft.com/ja-jp/dotnet/core/porting/windows-compat-pack とはいえ、無いものもあります。その話は後程。 Point 1 Copyright 2019 @nuits_jp Slide 23
  24. To Migration again. Copyright 2019 @nuits_jp Slide 24

  25. .NET Coreで正式に非対応なものも存在します。 AppDomain、.NET Remoting、コード アクセス セキュリティ (CAS)、透過 的セキュリティコードなど。 https://docs.microsoft.com/ja-jp/dotnet/core/porting/net-framework-tech-unavailable •

    自分のコード内の場合 → .NET Portability Analyzerでチェックし別の実現手段を採用 https://docs.microsoft.com/ja-jp/dotnet/standard/analyzers/portability-analyzer • サードパーティ コード内の場合 → .NET Coreもしくは.NET Standard対応ライブラリに変更 Point 2 Copyright 2019 @nuits_jp Slide 25
  26. ちょっと待って! Copyright 2019 @nuits_jp Slide 26

  27. なんで.NET Frameworkプロジェクトを参照できるの?? Copyright 2019 @nuits_jp Slide 27

  28. Xamarinを例に考えると(私には)分かりやすい Copyright 2019 @nuits_jp Slide 28 User Side Framework Side

    System.IO.File for .NET Standard My Class Library for .NET Standard My Application User Interface for .NET Standard Build時 Android実行時 iOS実行時 System.IO.File for Mono.Android My Class Library for .NET Standard My Application User Interface for .NET Standard Mono.Android Runtime java.io.File My Class Library for .NET Standard My Application User Interface for .NET Standard System.IO.File for Mono.iOS Mono.iOS Runtime NSFileManager ? and Switch Bait
  29. .NET Frameworkと.NET Coreの場合 Copyright 2019 @nuits_jp Slide 29 User Side

    Framework Side .NET Framework Runtime Win32 API System.IO.File for .NET Framework My Class Library for .NET Framework My Application for .NET Framework Original .NET Core Windows Runtime Win32 API System.IO.File for .NET Core My Class Library for .NET Framework My Application for .NET Core .NET Coreで実行時 .NET CoreでBuild時 System.IO.File for .NET Framework My Class Library for .NET Framework My Application for .NET Core and Switch Bait
  30. なぜ.NET Frameworkのプロジェクト参照が通るのか 理由は主に2点 • 中間言語(CIL)は共通仕様である • ネイティブ呼び出しは元々サポートされている 従って条件を満たせば、.NET Frameworkでビルドしたモジュール も.NET

    Coreから利用可能です。 Copyright 2019 @nuits_jp Slide 30
  31. .NET Frameworkと.NET Coreの場合 多分こんなイメージ(ちょっと間違ってるかも? Copyright 2019 @nuits_jp Slide 31 User

    Side Framework Side .NET Framework Runtime Win32 API System.IO.File for .NET Framework P/Invoke My Class Library for .NET Framework My Application for .NET Framework .NET Core Runtime Win32 API System.IO.File for .NET Core P/Invoke My Class Library for .NET Framework My Application for .NET Core
  32. .NET Frameworkと.NET Coreの場合 多分こんなイメージ(ちょっと間違ってるかも? Copyright 2019 @nuits_jp Slide 32 User

    Side Framework Side .NET Framework Runtime Win32 API System.IO.File for .NET Framework P/Invoke My Class Library for .NET Framework My Application for .NET Framework .NET Core Runtime Win32 API System.IO.File for .NET Core P/Invoke My Class Library for .NET Framework My Application for .NET Core この二つは完全に別物です My Class Libraryから利用している クラス・メソッドがCoreに存在しない 場合、実行時エラーとなります
  33. 1. .NET Frameworkでビルドされたモジュールも動作する可能性はある .NET Framework 互換モード https://docs.microsoft.com/ja-jp/dotnet/core/porting/third-party-deps#net-framework-compatibility-mode 2. ただし直接・関節的に.NET Coreでサポートされていない物に依存して

    いる可能性がある 3. サードパーティの.NET Frameworkライブラリが.NET Core上で正常動作 するかどうか、.NET Portability Analyzerではわからない(と思う) 4. 一時的に動作していても、内部分岐で突如動かなくなる可能性がある 5. 可能な限り.NET Coreもしくは.NET Standard対応ライブラリを利用する Point 3 Copyright 2019 @nuits_jp Slide 33
  34. To Migration again. Copyright 2019 @nuits_jp Slide 34

  35. 不安視してたけど問題なかった箇所 • ビルドしたDLLの編集(静的コード生成) • TWAIN制御(.NET→COM→Win32 API 32bit driver) • System.Drawing.Bitmapに依存(つまりGDI+に依存)

    Copyright 2019 @nuits_jp Slide 35
  36. まとめ Copyright 2019 @nuits_jp Slide 36

  37. 1. .NET CoreのWPFサポートは非常に魅力的です 2. 移行は(依存ライブラリが.NET Standard対応してれば)そう難しくない! 3. まずは公式ドキュメントを参照 • .NET

    Framework から .NET Core にコードを移植する https://docs.microsoft.com/ja-jp/dotnet/core/porting/ • WPF デスクトップ アプリを .NET Core に移植する https://docs.microsoft.com/ja-jp/dotnet/core/porting/wpf 4. .NET Framework製のライブラリは .NET Coreもしくは.NET Standardへ全て移行推奨 → 動作する可能性はあるが、特定の条件下で.NET Core 未サポートのAPIを利用している可能性があり危険 まとめ Copyright 2019 @nuits_jp Slide 37
  38. Thank You! Any Questions?