こんにちは! インフラジスティックス・ジャパン テクニカルコンサルティングチームの石橋です。
このシリーズ記事では「.NET Framework 4.8 で作成した WPF アプリケーションを .NET 6 にアップグレードする」と題して、.NET アップグレード アシスタントを使って .NET Framework 4.8 で作成した WPF アプリケーションを .NET 6 にアップグレードする方法を 4 回にわけて書いていきたいと思います。
今回はついに最終回「Step 3: .NET アップグレード アシスタントでアップグレードできない部分を手動で置き換え、ビルドする」です。
Step 0: はじめに -- 出発点となる .NET Framework 4.8 WPF アプリケーションの説明
Step 1: 実行環境を準備する
Step 2: .NET アップグレード アシスタントでアップグレードする
Step 3: .NET アップグレード アシスタントでアップグレードできない部分を手動で置き換え、ビルドする (今回はここ)
このブログで使用する WPF アプリケーションのソース コードは GitHub にあります。
https://github.com/igjp-sample/WPF_DotNetFramework2DotNet_UpgradeAssistance
前回 Step 2 の終わり時点のアプリケーションは、./Step2/ScoreSheets_SampleWPFApplication です。これをローカルにダウンロードして読み進めてください。この記事では C:\ のすぐ下に Step2\ScoreSheets_SampleWPFApplication フォルダーがあり、この下にソリューション ファイルとプロジェクト フォルダーがあるという想定で進めていきます。
では早速進めていきましょう。
手動で調整する。
アップグレード結果を確認する
アップグレード後の .csproj ファイルの構成プロパティ部分を見てみましょう。
ScoreSheets_SampleWPFApplication.csproj |
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net7.0-windows</TargetFramework> <OutputType>WinExe</OutputType> <LangVersion>8.0</LangVersion> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <UseWindowsForms>true</UseWindowsForms> <UseWPF>true</UseWPF> <ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets> </PropertyGroup> </Project> |
- Sdk: Microsoft.NET.Sdk
- TargetFramework (アプリケーションのターゲット フレームワーク バージョン): net7.0-windows (.NET 7 Windows アプリケーション)
- OutputType (出力形式): WinExe (Windows ベースの実行形式を出力。変更なし)
- UseWindowsForms、UseWPF: UI フレームワークの指定
マイクロソフトが出している公式ドキュメントの通りの設定に更新されているのが確認できます。
また、カスタム設定が (可能性も含めて) されている項目 (今回の場合は LangVersion や GenerateAssemblyInfo) はそのまま残っているのも確認できます。
続いて .csproj ファイルの参照設定も見てみましょう。
ScoreSheets_SampleWPFApplication.csproj |
<ItemGroup> <Reference Include="InfragisticsWPF4.Controls.Charts.XamDataChart.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> <Reference Include="InfragisticsWPF4.Controls.Menus.XamDataTree.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> <Reference Include="InfragisticsWPF4.DataManager.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> <Reference Include="InfragisticsWPF4.DataPresenter.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> <Reference Include="InfragisticsWPF4.DataVisualization.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> <Reference Include="InfragisticsWPF4.Documents.Core.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> <Reference Include="InfragisticsWPF4.Documents.Excel.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> <Reference Include="InfragisticsWPF4.DragDrop.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> <Reference Include="InfragisticsWPF4.Editors.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> <Reference Include="InfragisticsWPF4.v22.2, Version=22.2.20222.30, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> </Reference> </ItemGroup> <ItemGroup> <Content Include="Data\成績データ.xlsx"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> <PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" /> <PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.4.355802"> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="Microsoft.Windows.Compatibility" Version="7.0.0" /> </ItemGroup> |
.NET 6 に置き換えることができたアセンブリは PackageReference に列挙されています。
それ以外のマイクロソフトからみてサード パーティ製であるインフラジスティックスのアセンブリはすべてそのまま残っているのがわかります。先ほどの LangVersion もそうですが、カスタマイズされている部分は手を付けずにそのまま残す、が .NET アップデート アシスタントの仕様のようです (これはこれで個人的にはよい仕様だと思います)。
.csproj ファイルを開いてプロジェクトの構成プロパティを書き換える
Visual Studio の UI から書き換えられない個所をプロジェクトファイルで直接書き換えていきます。
ScoreSheets_SampleWPFApplication.csproj をエディターで開きます。書き換える部分は PropertyGroup 内の項目です。
ScoreSheets_SampleWPFApplication.csproj |
... (中略) ... |
LangVersion、GenerateAssemblyInfo、ImportWindowsDesktopTargets を丸ごと (行ごと) 削除します。削除することによりそれぞれ既定値 (LangVersion は C# 10、GenerateAssemblyInfo は true) でビルドされるようになります。ImportWindowsDesktopTarget は .NET 5 より前のバージョンでのみ必要となる設定で、.NET 5 以降は特に設定をしなくても .NET 側がインポートするようになっているので、削除してしまって構いません。
- C# バージョン既定値一覧:
- GenerateAssemblyInfo 既定値:
※GenerateAssemblyInfo を true (既定値) にする場合、.NET Framework で使用していた AssemblyInfo.cs は不要になります。
Microsoft.NET.Sdk の MSBuild プロパティ - .NET | Microsoft Learn
これに関してはあとで Visual Studio 上で対応します。
最終的に ScoreSheets_SampleWPFApplication.csproj ファイルの PropertyGroup の内容は以下のようになっているはずです。
ScoreSheets_SampleWPFApplication.csproj |
...(中略) ... |
上書き保存し、ファイルを閉じます。
.NET 6 Windows WPF アプリケーションに変更する
アプリケーションを Visual Studio 2022 で開きます。
Visual Studio のメニューの [プロジェクト] から [ScoreSheets_SampleWPFApplication のプロパティ] を選択してプロジェクト プロパティを開きます。
[アプリケーション] → [ターゲット フレームワーク] で .NET 6.0 を選択します。
[Windows フォーム] のチェックボックスのチェックを外します。
ソリューション エクスプローラーを開き、ソリューション、プロジェクト、[Properties] と展開していき、AssemblyInfo.cs を選択して開きます。
「.csproj ファイルを開いてプロジェクトの構成プロパティを書き換える」で書いた通り、GenerateAssemblyInfo を true にした場合 AssemblyInfo.cs は不要になりますので、最終的にはこのファイルはプロジェクトから削除します。残しておくべき属性がある場合は、 [プロジェクト] から [ScoreSheets_SampleWPFApplication のプロパティ] を選択してプロジェクト プロパティを開き、そこに情報を書き移していってください。今回は特にそういった情報はないのでそのまま AssemblyInfo.cs をプロジェクトから削除します。
インフラジスティックスのアセンブリを .NET 6 のものに置き換える
ソリューション エクスプローラーを開き、[依存関係] → [アセンブリ] と展開していき、"InfragisticsWPF4" で始まるアセンブリをすべて選択し、削除します。これらはすべて .NET Framework 4.8 用のアセンブリなので、削除してしまって構いません。
Visual Studio のメニューの [プロジェクト] から [NuGet パッケージの管理] を選択して NuGet パッケージ マネージャーを開きます。[参照] タブをクリックし、パッケージ ソースを Infragisitcs NuGet フィードに設定します (※ Infragistics NuGet フィードの設定がまだの場合は、Infragistics NuGet パッケージ ソース - Infragistics WPF™ ヘルプ を参照の上、Infragistics NuGet フィードを追加してください)。
パッケージの一覧から Infragistics.WPF.DataTree (XamDataTree 用のパッケージ) を探し出し、インストールします。検索ボックスで絞り込むと見つけやすいです。
同じように、
- Infragistics.WPF.Charts (XamDataChart 用のパッケージ)
- Infragistics.WPF.DataGrids (XamDataGrid 用のパッケージ)
- Infragistics.WPF.Excel (Excel エンジン用のパッケージ)
をインストールします。
最終的にソリューション エクスプローラーの依存関係のパッケージの中身が以下のようになっていれば OK です。
ビルドする
Visual Studio のメニューの [ビルド] → [ソリューションのクリーン] でいったんクリーンにしてから、[ビルド] → [ソリューションのビルド] を実行します。
出力ウィンドウ |
1>プロジェクト "ScoreSheets_SampleWPFApplication.csproj" のビルドが終了しました。 ========== ビルド: 成功 1、失敗 0、最新の状態 0、スキップ 0 ========== |
[エラー一覧] を開きます。
エラーも警告もありません! もしエラーや警告が出ている場合は一つ一つつぶしていってください。
※たとえば、.csproj ファイルの GenerateAssemblyInfo をそのままにしておくと CA1416 の警告が出ることがあります。実のところ、前段で GenerateAssemblyInfo の削除や AssemblyInfo.cs の情報書き写しと削除をしたのは、この警告に対応するためでした。
実行する
Visual Studio からアプリケーションを実行します。ウィンドウが開いて左側の学年のリストから「1年生」をクリックしてみてください。グラフと表が表示されれば実行成功です!
まとめ
これまで 4 回にわけて .NET Framework 4.8 の WPF アプリケーションを .NET アップグレード アシスタントを使用して .NET 6 の WPF アプリケーションに変更する手順を見てきました。
- .NET アップグレード アシスタントの実行環境を用意する。
- .NET アップグレード アシスタントでアップグレードする。
- .NET アップグレード アシスタントでアップグレードできない部分を手動で置き換える。
- ビルドしてエラーや警告が出た場合は一つ一つ解決していく。
でアップグレードできることが確認できました。
環境によっては手順の増減はあるかもしれませんが、参考にしていただければ幸いです。
この記事の内容についてご質問やご不明な点がありましたら、インフラジスティックスのお問い合わせ先までお問い合わせください。
また、こちらからインフラジスティックスの WPF 製品の試用版をダウンロードできます。今回のアプリケーションで使用したコントロール (XamDataTree、XamDataChart、XamDataGrid、 Excel エンジン) 等に少しでも興味を持った場合はぜひお試しください。