.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とは?
クロスプラットフォームを前提とした.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をダウンロードし、インストールします。
WPFのプロジェクト作成
以下のコマンドで新規プロジェクトが作成できます。 今回は「wpf_application」という名前で作成します。 -nオプションでプロジェクト名を指定することで、フォルダが自動で作成されます。
> dotnet new wpf -n wpf_application
作成直後のフォルダはこんな感じです。 Visual Studioでプロジェクトを作るのとあまり変わらないですね。
以下のコマンドでアプリケーションを実行できます。
> dotnet run
このままだと見た目が寂しく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>
変更後はこちら
アプリケーションの発行
.Net Coreではアプリケーションの配布物に.Net Coreのランタイムを含めることができるそうで、これを「自己完結型の展開 (SCD)」といいます。 今作成したアプリケーションで試してみたいと思います。
まずは、.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のアプリを作るのは新鮮な気持ちになりました。 今回感じた事としては
- VisualStudioの起動を待つことなく、プロジェクトの作成も早いので、ちょっとコードを書いて動かしたい場合は便利
- 自分の好きなエディタが使える
- 現在はWindowsしかサポートされていないが今後はクロスプラットフォーム対応が期待できる
といったところでした。
次回は@oharyoさんによる「AWSのサービス2つでサーバーレスWebアプリケーションを作る方法」の予定です!