.Net Core 3.0 でWPF開発を試す

こんにちは。弥生の久保田です。 この記事はMisoca+弥生+ALTOA Advent Calendar 2018 の11日目として掲載しています。

はじめに

つい先日、.Net Core 3.0のプレビュー版がリリースされました。WPF と Windows Formが.Net Coreでサポートされるとアナウンスされています。 .Net CoreということでWPFがオープンソースになるわけですが、.Net FrameworkのWPFとどう変わるのか興味がわいたので、これを機に.Net CoreでWPF開発を試してみようと思います。すでに試されている方もいて何番煎じがわかりませんが、やってみます。

.Net Coreとは?

docs.microsoft.com

クロスプラットフォームを前提とした.Netの開発プラットフォームで Windows, Mac, Linux上で動作するアプリケーションを作成できます。 一方で.Net FrameworkはWindows上で動作することを前提とし、WindowsOSに依存する機能が多数含まれています。

.Net Coreはdotnetコマンドを使ってプロジェクトの作成から、パッケージ管理、ビルド、発行まで行うことができ、 Visual Studioを使わずともターミナルとテキストエディタがあれば開発が可能です。

環境

  • Windows 10 Pro
  • .Net Core 3.0 Preview 1
  • Visual Studio Code

.Net Core 3.0 Previewのインストール

ここからインストーラー形式のSDKをダウンロードし、インストールします。

dotnet.microsoft.com

WPFのプロジェクト作成

以下のコマンドで新規プロジェクトが作成できます。 今回は「wpf_application」という名前で作成します。 -nオプションでプロジェクト名を指定することで、フォルダが自動で作成されます。

> dotnet new wpf -n wpf_application

作成直後のフォルダはこんな感じです。 Visual Studioでプロジェクトを作るのとあまり変わらないですね。

f:id:ym_AdventC:20181210165835p:plain

以下のコマンドでアプリケーションを実行できます。

> dotnet run

f:id:ym_AdventC:20181210165945p:plain

このままだと見た目が寂しくWPFっぽくないので、WindowChromeを利用してウィンドウを少し変更してみます。


<Window x:Class="wpf_application.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf_application"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        Background="#FF494949"
        BorderBrush="#FF14A9FF"
        BorderThickness="1"
        Foreground="White">
    <WindowChrome.WindowChrome>
        <WindowChrome CornerRadius="3" GlassFrameThickness="1" ResizeBorderThickness="8" UseAeroCaptionButtons="False" CaptionHeight="26" />
    </WindowChrome.WindowChrome>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <DockPanel Grid.Row="0">
            <TextBlock Text="MainWindow" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="6,3,12,3" FontSize="14.667" />
            <Button Content="✕" Width="24" Height="24" HorizontalAlignment="Right" Background="Red" BorderThickness="0" Foreground="White" WindowChrome.IsHitTestVisibleInChrome="True"
                    Click="ButtonExit_Click"/> 
        </DockPanel>
        <Label Grid.Row="1" Content="Hello .NET Core!" HorizontalAlignment="Center" VerticalAlignment="Center"
               FontSize="40" Foreground="White"/>
    </Grid>
</Window>

変更後はこちら

f:id:ym_AdventC:20181210170021p:plain

アプリケーションの発行

.Net Coreではアプリケーションの配布物に.Net Coreのランタイムを含めることができるそうで、これを「自己完結型の展開 (SCD)」といいます。 今作成したアプリケーションで試してみたいと思います。

docs.microsoft.com

まずは、.csprojファイルを編集します。 PropetyGroupにRuntimeIdentifiersタグを追加


 <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWPF>true</UseWPF>
    <RuntimeIdentifiers>win10-x64</RuntimeIdentifiers>
  </PropertyGroup>

</Project>

dotnet publish コマンドでアプリケーションを作成

> dotnet publish -c Release -r win10-x64

作成されたファイルは./bin/release/netcoreapp3.0/publishに配置されます。 フォルダの中を見るとアプリケーションの実行ファイルの他に、.Net Core本体のDLLが大量に含まれていました。 publishフォルダをまるごと、別の仮想マシン(Win10 64bit)へ配置したところ、.Net Coreが入っていなくても起動できました。

これのメリットとしては、ランタイムの配布やバージョンアップがOSの管理者でなくても開発者主導で行える事ですね。 逆に配布物のファイルサイズが大きくなってしまうデメリットもあります。

まとめ

.Net Core 3.0のWPFを試してみましたが、ターミナルとテキストエディタ(VSCode)で.Netのアプリを作るのは新鮮な気持ちになりました。 今回感じた事としては

  1. VisualStudioの起動を待つことなく、プロジェクトの作成も早いので、ちょっとコードを書いて動かしたい場合は便利
  2. 自分の好きなエディタが使える
  3. 現在はWindowsしかサポートされていないが今後はクロスプラットフォーム対応が期待できる

といったところでした。

次回は@oharyoさんによる「AWSのサービス2つでサーバーレスWebアプリケーションを作る方法」の予定です!