.NET Core 3.0が正式リリースされました。
今回の目玉のひとつであるWPF、WinFormsの.NET Core移植がどんな感じになっているか、ちょっと試してみました。

以前に作成したValidation関連のライブラリは.NET Standard2.1で作ってあったので、これにサンプルプロジェクトとして.NET CoreのWPFプロジェクトを追加してみました。

ソースは前回のものをそのまま修正してGitHubのこちらに置いてあります。

結論から言うと、あっさり移行できました。

サンプルプロジェクト SampleWpfApp2

.NET Frameworkのサンプルプロジェクト SampleWpfApp1と同じように作成します。
名前は SampleWpfApp2 です。

Visual Studio 2019でプロジェクトを追加します。

プロジェクト追加

WPF App(.Core)というやつですね。
実行すると.NET Framework版と同様、MainWindowとAppが含まれたプロジェクトが追加されます。
ここにSampleWpfApp1のUserControl1、UserControl2とMainWindowを入れていくわけですが、ViewModel等は2つのプロジェクトで共用したいので、新たにSampleModelsというライブラリプロジェクト(.NET Standard)を追加して、そちらへ移動しました。

SampleModelsプロジェクトのビルド成功を確認後、UserControl1、UserControl2をSampleWpfApp2へコピーします。
コピー直後はxamlファイルとxaml.csファイルがプロジェクトエクスプローラー上に別々に表示されました。

プロジェクトファイルのDependentAponの設定が落ちちゃってるのかなと思い、プロジェクトファイルの中身を確認すると、ちゃんと付いてます。ふむ。

一度、SampleWpfApp2プロジェクトをアンロードして読み込みなおすと、ちゃんとツリー構成になりました。Visual Studio 2019の不具合ですかねぇ。まぁ、軽微な問題ですけど。

余談ですが、.NET Coreと.NET Standardプロジェクトはアンロードしなくてもプロジェクトファイルの中身をさっと確認できるのは便利です。

それぞれ、xamlとコードビハインドファイルの名前空間を書き換えてビルド。問題無くビルドできます。
ちょっと気になったのは、

    <d:DesignerProperties.DesignStyle>
        <Style TargetType="UserControl">
            <Setter Property="Background" Value="White"/>
        </Style>
    </d:DesignerProperties.DesignStyle>

こういう指定で、UserControlのデザイン時の背景色を変えることが出来ていたのですが、.NET Coreは使えないみたいです。
Styleタグのところで解析エラーが出ています。
VisualStudioをダークテーマで使っているとUserControlが真っ黒で表示されちゃう(UserControl.Background=Transparentがデフォルトなため)んですよねぇ。重宝していただけに、悲しい... Visual Studio 2019のWPFデザイナの問題ですかねぇ。Blend周りの問題ですかねぇ。

もう一点、.NET Framework版との差異がありました。

App.xaml.csに以下のようなコードを書いていたのですが、

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using Nekoni.DataValidation;
using SampleModels;

namespace SampleWpfApp2
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            // エラーメッセージリソースの設定
            Configuration.DefaultErrorMessageResourceTypeProvider = (attr) => typeof(ErrorMessage);
            Configuration.DefaultErrorMessageResourceNameProvider = (attr) =>
            {
                var attrName = attr.GetType().Name.Replace("Attribute", string.Empty);
                return attrName.StartsWith("Check") ? attrName : $"Check{attrName}";
            };
        }
    }
}

ConfigurationクラスはSystem.Configuration.ConfigurationとNekoni.DataValidation.Configurationで定義されているため、あいまいとのこと...

そっかー。.NET Core ではSystem.Configuration周りは色々変わっているんでした。
名前空間を修飾するのもなんなので、ValidationConfigクラスに名称変更しました。

WPFやWinFormsには無関係ですが、既存の.NET Frameworkで動いていたものを移行する場合は、こういう問題が起きるかもしれませんねぇ。

.NET CoreのWPF対応ということ自体には関係ありませんが、依存ライブラリをいくつかアップグレードしています。
ReactivePropertyはメジャーバージョンが6に上がっています。
Blend関連のライブラリがBlendとは別管理になり、名前空間が変わっていることへの対応みたいです。詳しくはWPF のビヘイビアーが入ってる Blend SDK for Visual Studio が Visual Studio 2019 で消えた件についてReactiveProperty v6.0.2 をリリースしましたをご覧ください。


まとめ

冒頭でも述べましたが、あっさり移行できました。Visual Studio 2019のツールサポートもまぁまぁよく出来ていそう。

他の依存ライブラリの対応状況を見ながら、積極的に移行したいですが、大人の事情が絡む場合は難しいかな...。

11月にはLTS版の.NET Core 3.1がリリース予定です。
このサイトは.NET Core 2.1で動作しているのですが、3.1がリリースされたら移行しようと思います。