[.NET Conf 2019]のデスクトップアプリケーション.NET Core対応についてのセッションを日本語訳した（.NET Coreを使用した.NET デスクトップアプリケーションの近代化）

この投稿は、[.NET Conf 2019](https://www.dotnetconf.net)（2019/9/23-25）のセッションを日本語訳し文章に起こしたものです。正確なところは、実際のセッションをご確認ください。

Modernizing .NET Desktop Applications with .NET Core
https://www.youtube.com/watch?v=k7z4ZxFc8h8

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/jwjAoTxWVL">https://t.co/jwjAoTxWVL</a></p>&mdash; tfukumori_qiita (@TfukumoriQ) <a href="https://twitter.com/TfukumoriQ/status/1183331397299163136?ref_src=twsrc%5Etfw">October 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 1. TL;DR（要約）

あなたのアプリケーションをどのようにして.NET Core 3.0にアップデートすることができるのか

- .NET Coreデスクトップでの注意点
- .NET Coreと.NET Frameworkどちらを選択するのか
- .NET Coreへの変換（Potring）
- 変換時に発生する問題の解決方法
- .NET Coreデスクトップアプリケーションのためのツール
    - XAML Designer
    - WinForms Designer (Preview 1)

## 関連スライド: .NET Conf 2019 のデスクトップアプリに関するセッションについて

https://www.slideshare.net/TakuhiroFukumori1/net-conf-2019-182733170

このイベント時に作成

https://kagoshima-dotnet.connpass.com/event/149260/

# 2. .NET Core デスクトップとは何か

.NET Coreに移行することで多くの利点があるが、中でも特に大事な点は、.NETの未来が.NET Coreである、ということだ。

来年には、.NET 5がリリースされる（2020年11月）。なので、あなたのアプリケーションを.NETに移植しておくことで、.NET 5が出たときに、.NET 5への移行をスムーズに行うことができる。そして、.新機能の組み込みにも対応できる。

また、現時点でも.NET Frameworkでは実現できない多くの.NET Core特有の機能がある。

## 2-1. 同一マシンでの異なる.NET Coreバージョンのアプリケーションの実行（Side-by-side） 

.NET Frameworkでは、１つのバージョンしか実行できず、常に最新のバージョンに入れ替えていく必要があった。そのため開発者はは依存関係に気をつける必要があり、IT部門は会社全体で意思決定をしていく必要があった。

.NET Coreでは、各アプリケーションそれぞれのペースで更新することができる。なぜなら、.NET Coreはそれぞれのバージョンが同一マシンで共存することができ、各アプリケーションはターゲットとしたいバージョンをそれぞれで決めることができるからだ。

## 2-2. 自己完結型のアプリケーション

アプリケーションを自己完結型のアプリケーションとして配布することができる。これは動作環境で完全に独立して動作する

MSIX は新しい Windows アプリケーション パッケージ形式であり、Windows 10 に .NET Core 3.0 のデスクトップ アプリケーションを展開するために使用できる。
https://www.itmedia.co.jp/pcuser/articles/1806/07/news110.html
https://docs.microsoft.com/ja-jp/dotnet/core/whats-new/dotnet-core-3-0#msix-deployment---windows-desktop

## 2-3. 単一ファイルの実行ファイル

アプリケーションを単一ファイルの実行ファイルとして作成できる。これは、アプリケーションと.NET Core を１つの大きなZIPファイルとしたものとなる

## 2-4. 小さいアプリケーションサイズ

.NET Core 3 では、アセンブリサイズが小さくなったため、実行ファイルのサイズが、.NET Core 2.2以前に比べて小さくなっている

## 2-5. 他にも多くの特徴がある

# 3. .NET Framework、.NET Core どちらを選択するのか

現在保持している.NET Frameworkのアプリケーションを全て.NET Coreに移植すべきなのか、という質問を多く受ける。こちらに対してのアドバイスは次のようになる。

## 3-1. 新規アプリ

.NET Coreで作成しましょう。

## 3-2. 既存アプリでメンテナンスモード

既存アプリで完全にメンテナンスモードで、全ての開発は終了しており、機能変更目的のコードの変更は発生しないものは、.NET Frameworkのままで良い。

実際、Visual Studioは.NET Frameworkを完全にサポートし、.NET Frameworkのセキュリティアップデートも問題なく行われている。

## 3-3. 既存アプリでまだ開発が行われている

既存アプリで開発が行われており、コードの変更があり、.NET Coreでの新機能の恩恵を受けたい場合は、NET Frameworkから.NET Coreへの変換を検討した方が良い。

重要な点は、各アプリケーションの特定のケースがあるので、.NET Coreでの恩恵と、移植に必要な作業量を評価して決断することである。

# 4. アプリケーションの.NET Coreへの互換性の判断は？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/47d3b79c-9640-9fbb-0fc1-4081e20c4f4c.png)

## 4-1. Portability Analyzer
https://aka.ms/portabilityAnalyzer

次によく来る質問は、アプリケーションを.NET Coreに対応させるためにどのぐらいの作業が発生するのか、という質問だ。

そのためには、Portability Analyzerを使用する。

このツールは、あなたのアプリケーションで使用されている全てのAPIについて、.NET Core 3でサポートされているかを示し、.NET Core互換とするために必要なリファクタリングについて助けとなってくれる。

## 4-2. デモ

Portability Analyzerを使用した実際のデモを行った。

デモで使用されたアプリケーションは、WPFアプリケーションで、画像のスライドショーを行うことができ、Tシャツなどグッズへの印刷依頼をオンラインで行うことができる、というもの。

1. Portability Analyzerを実行
2. 移植性を判断したいアプリケーションのフォルダのパスを選択する
3. [Anazlize]をクリック
4. アプリケーションが参照しているアセンブリと全てのAPIについてチェックし、結果をExcelに出力する。

レポートでは、.NET FrameworkのAPIが.NET Coreに存在するかを出力する。

### Portability Summary シート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/77eb0143-3bb8-e0da-3068-b06f446cdd6f.png)


|列名|内容|
|:--|:--|
|Header for assembly name entries|アセンブリ名|
|Target Framework|現在のターゲットフレームワーク|
|.NET Core + Platform Extensions|.NET Coreとの互換性を%表示する。<br/>高ければ互換性が高いということを示し、100%に満たないということは.NET Coreでは完全にサポートされていないということ|

### Detail シート

サポートされていない関数について、詳細を確認できる。

|列名|内容|
|:--|:--|
|Target type|APIのタイプ|
|Target member|関数、プロパティなど|
|Header for assembly name entries|アセンブリ名|
|.NET Core + Platform Extensions|.NET Coreでサポートされているか|
|Recommended Changes|お勧めの変更方法|

しかし、詳細を確認する前に、まずはSummaryをよく確認し、100%に満たない互換性を持つアセンブリは何かを確認することを勧める。

例えば、今回の例では、1、2行目は、NewtonのJSONのnuget package を使っていることがわかる。この場合、開発元が新しいバージョンで、.NET Coreや.NET Standardをサポートしているのであれば、対応バージョンにバージョンアップすれば良い。全て自分で対応を行う必要はない。

この場合、Newton JSONは開発元が.NET Coreに対応しているので、このアプリケーションは、.NET Coreとの互換性がある、ということになる。

# 5. 移植（Porting）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/471e78c4-87d9-2c98-99ed-2e404f0141b8.png)

.NET Frameworkから.NET Coreへの移植は、単純にcsprojファイルの"TargetFramework"の値を変更するだけで良い。

しかし、もし.NET Frameworkで作成されたプロジェクトが、まだ旧形式のプロジェクトファイルの場合は、"Target Framework"パラメーターを変更する前に、プロジェクトの形式をSDK形式に移行する必要がある。

## 5-1. プロジェクトの形式がどちらかを確認する手順

1. Visual Studioでプロジェクトを開く
2. プロジェクトをアンロードする
3. プロジェクトファイルを開き、大きなファイルサイズで"ProjectGuid"などを持っていれば、旧形式となる

## 5-2. 手作業での.NET Coreへの移植手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/8db39ad4-3cf3-c151-344e-ea6f9ed59c6f.png)

1. Visual Studioで該当プロジェクトを開く
2. packages.configファイルがあるなら、packages.configを選択し、右クリックメニューから「PackageReferenceへの移行」を実行する
3. 新しい空の.NET Coreプロジェクトを作成し、現在の.NET Frameworkのアプリケーションから、全てのファイルをコピーして貼り付ける。
4. csprojファイルを比較し、元のプロジェクトから、必要に応じて参照とリソースを追加する。

## 5-3. Try Convertを使った移植

移植のケースは多岐に渡るので、最終的に手作業での手順が必要になることもあるが、多くのケースで使えるようなツールを作成した。

Try-Convertツール
https://github.com/dotnet/try-convert

```posh
.\try-convert.exe -p “<path to your .csproj file>"
```

プロジェクト形式の変換と、"TargetFramework"の.NET Core 3.0への変更を行ってくれる。
引数として、.NET Frameworkのプロジェクトファイルを指定するだけで良い

変換後に、プロジェクトファイルの形式が変換され（"ProjectGuid"がない、アンロードせずともプロジェクトファイルを編集できる）、プロジェクトのプロパティが.NET Core 3.0に変更されていれば変換成功となる。

うまくいけば、数ステップで変換可能である。

# 6. Windows Compatibility Pack

.NET Core に移行後にいくつかのアセンブリが参照できないということがあるかもしれない。それを解決するのが、nugetで取得できる Microsoft.Windows.Compatibilityとなる

このMicrosoft.Windows.Compatibilityは、.NET Coreと.NET Standardから参照できる。21,000のAPIを持っている（ただし、Windows でのみ使用可能）

## 6-1. 内容

- ACLs
- Code Pages
- CodeDom
- Configuration
- Crypto
- DirectoryServices
- EventLog
- MEF
- Odbc
- Perf Counters
- Permissions
- Ports
- Registry
- Runtime Caching
- WCF
- Windows Services

# 7. デザイナー

デザイナーは、アウトプロセスで動作し、Visual Studioと通信している形となり、実装は大変な作業だった。

## 7-1. XAML Designer

.NET CoreでGUIで使用できるXAMLデザイナーが用意されている。以前からのデザイナーとの違いは見た目でもほとんど分からない。

## 7-2. WinForms Designer Preview 1

https://aka.ms/winforms-designer

上記リンクからvisixパッケージとしてダウンロードできる。

WinFormsデザイナーは、初期バージョンであるため、まだVisual Studioに含まれていない。
共通コントロールと、基本的な操作をカバーしている

毎月プレビューを更新していく予定だが、このバージョンはまだ実際のアプリケーションに使用することはお勧めしない。あくまでプロトタイプなどの使用としてほしい。

私たちは、絶対に、あなたのアプリケーションを.NET Coreに移植する良いタイミングを知らせるので、使用したフィードバックをVisual Studio feedback channelで知らせてほしい

Developer Community
https://developercommunity.visualstudio.com/spaces/8/index.html

現時点で、コモンコントロールの配置、コントロール名の変更、サイズ変更などは既に行うことはできる。

# 8. 関連するセッション

あなたの.NETデスクトップアプリケーションを、.NET Core 3で近代化する方法について。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/22e66458-690a-8bb6-689b-c006e3a3a8ca.png)

アップグレード、またはモダナイズする方法としては、多くの異なる方法が存在する。

それは見た目の変更だけではなく、パフォーマンスの向上、デバイスの管理、DevOpsを行う上でのアプリケーションの展開(Deploy)などが挙げられる。

私たちは多くのイノベーションを実現した。

## 8-1. With .NET Core 3.0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/9a2af349-be7a-5a48-3632-7c10f91f58b6.png)

### Modernizing .NET Desktop Applications with .NET Core

https://www.youtube.com/watch?v=k7z4ZxFc8h8

- このセッション
  - あなたのアプリケーションをどのようにして.NET Core 3.0にアップデートすることができるのか

### Modernizing NET Applications with NET Core Beyond the Basics
https://www.youtube.com/watch?v=tCDiqNUflk4

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/FWNnhZoeMz">https://t.co/FWNnhZoeMz</a></p>&mdash; tfukumori_qiita (@TfukumoriQ) <a href="https://twitter.com/TfukumoriQ/status/1183331121607503874?ref_src=twsrc%5Etfw">October 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- あなたのWPFアプリケーションを.NET Core 3.0に変換するにあたっての高度なシナリオについて
  - Sandbox (Security)を残す方法
  - AppDomainsを使わない方法
  - 設定に関して
  - 互換性に関するオプション
  - 通信について（リモーティング、Simple IPC）

## 8-2. XAML Tools, XAML Islands

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/506d0433-c339-75f4-3906-d3c2c82621e8.png)

あなたのアプリケーションをモダンな見た目にする方法。だけではなくてあなたのアプリケーションをデバイスやプラットフォームと統合することができる。

XAML ToolsとXAML Islandsについてのセッションがある。

XAML Islands
https://docs.microsoft.com/ja-jp/windows/apps/desktop/modernize/xaml-islands

> 既存の WPF、Windowsフォーム、およびC ++ Win32 アプリケーションで Windows Inkなどの UWP 機能と Fluent Design System をサポートするコントロールを使用できます。

### Tour what’s new for XAML tools & Xaml Islands in Visual Studio 2019
https://www.youtube.com/watch?v=NtRYWpaADRo

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/XrBUMjzcaK">https://t.co/XrBUMjzcaK</a></p>&mdash; tfukumori_qiita (@TfukumoriQ) <a href="https://twitter.com/TfukumoriQ/status/1183330823283412993?ref_src=twsrc%5Etfw">October 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- XAMLツールについて全般的に説明
    - XAMLの開発者に向けて新しい機能の説明（ホットリロード, デザイナーとコードエディタ）
    - 現在のあなたのアプリケーションを.NET CoreとXAML Islandsでモダナイズする。
    - 楽しみな機能
        - Win Ui 2.x とその先
            - (訳注) [Windows デスクトップアプリ開発と消えた Prism for Windows (Prism は消えてないよ)](https://blog.okazuki.jp/entry/2019/07/06/003100)
            - (訳注) [WPF on .NET Core 3.0 + XAML Islands で Windows UI Library を使おう](https://blog.okazuki.jp/entry/2019/10/15/102333)
        - Toolのロードマップ。XAML Toolはどこを目指しているのか
        - 意見を聞かせてほしい

## 8-3. Devops, MSIX, App Center

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/0f74c113-bde4-8436-e8e7-9d8d7673c104.png)

DevOpsとMSIXとApp Centerについて、そして分析と診断をアプリケーションに組み込む方法、アプリケーションを展開(Deploy)して配布(Distrbute)する方法について。

### Get Started with DevOps for .NET Windows Desktop Apps and Visual Studio App Center

https://www.youtube.com/watch?v=8ioUk4RajpM

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/dyg610LUxo">https://t.co/dyg610LUxo</a></p>&mdash; tfukumori_qiita (@TfukumoriQ) <a href="https://twitter.com/TfukumoriQ/status/1183333760441311232?ref_src=twsrc%5Etfw">October 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- DevOpsとは何か
- .NET Core デスクトップアプリケーションを展開(Deploy)する方法
- デモ
- ロードマップと関連資料
- 質疑応答

# リソース

- スライドとコード

    https://github.com/dotnet-presentations/dotnetconf2019/tree/master/Technical

- Portability Analyzer

    https://aka.ms/portabilityAnalyzer

- Try-Convertツール

    https://github.com/dotnet/try-convert