キューブ日報

キューブキューブが書きそぼる日報。

お手軽Windowsアプリ開発(WPF - .NET Framework 4.7編)

Visual Studio Code(以下VSCode)でサクサクWPFアプリの開発をしようという試み、.NET Framework版です。

ほぼ.NET 5での開発と同じ流れなのですが、細かいところをいくらかいじらないと動きません。ですので今回は前回の記事を参考にしていただきつつ、いじるべき部分を中心にご説明出来ればと思っています。

なお、開発環境の構築は別の記事で説明しておりますので、そちらで準備を整えておいてください。

 

下準備

作業フォルダとして、今回は「net47test」というフォルダで作業する前提で話を進めます。

VSCodeを起動し、メニューの「ファイル」→「フォルダーを開く」で、あらかじめ作成しておいた「net47test」フォルダを開きます。

ターミナルも出しておきましょう。メニューの「ターミナル」→「新しいターミナル」です。

 

ケルトン生成

ターミナルにdotnet new wpfと入力し、Enterしてください。
ただし生成されたスケルトンは.NET 5用なので、いじって.NET Framework4.7でも動くようにします。

「net47test.csproj」を開き、下記2か所を変更してください。

  • 冒頭<Project>タグの属性、Sdkの中の「Microsoft.NET.Sdk」をMicrosoft.NET.Sdk.WindowsDesktop」に変更
    (「.WindowsDesktop」の追加)
  • <PropertyGroup>タグの中の<TargetFramework>タグの値を「net5.0-windows」から「net47」に変更

「net47」の部分は「TFM」と言うらしく、一覧表がMS公式のページに載っています。また、開発環境構築でBuildToolsをインストールする際に、ターゲットと同じバージョンのTargeting Packを選んでインストールしておく必要があります。

ケルトンの場合はこれで大丈夫ですが、割と新しめの名前空間(「System.Net.Http」とか)を使おうとすると「存在しません」とか言われて怒られます。
その場合は、プロジェクトファイルに参照を追加します。
例えば「System.Net.Http」の参照を追加した場合、プロジェクトファイルは下記のようになります。

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net47</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<Reference Include="System.Net.Http"/>
</ItemGroup>
</Project>

<PropertyGroup>タグと同じ階層に<ItemGroup>タグを追加して、その中に<Reference>タグを追加していく感じですね。
これで大体ビルドは通るようになるのではないかと思います。

 

デバッグ

まずはデバッグ設定ファイルを自動生成させます。環境の選択は「.NET Core」を選択します。なお、前回と違い「tasks.json」が自動で生成されないので、メニューの「ターミナル」→「タスクの構成」と進み「テンプレートから tasks.json を生成」「.NET Core」を選択していき、「tasks.json」を作っておきます。

「launch.json」がそのままではデバッグが動きませんので、下記の箇所を変更します。

  • "type"の値を「coreclr」からclrに変更(2か所あると思います)
  • "program"の値を「${workspaceFolder}/bin/Debug/net47/net47test.exe」にする

「net47」はプロジェクトのTargetFramework、「net47test.exe」の「net47test」はcsprojファイルのファイル名の拡張子を抜いた部分になります。

上記作業で、デバッグが動くようになると思います。

 

アプリの発行

まずは前回同様、リリースビルド時にデバッグ情報が入らないように設定しておきましょう。
「net47test.csproj」を開き、「PropertyGroup」タグ内に下記の要素を追加して保存してください。

<DebugType Condition="'$(Configuration)' == 'Release'">none</DebugType>

 

さて発行はdotnet publish」コマンドですが、.NET 5と違い、各種最適化オプションが効かないようです。(エラーが出ず、パッと見、通ったようでも有効になっていない。)
なので発行コマンドは下記のように比較的シンプルになります。

dotnet publish -c:Release -r:win10-x86