この記事では、Windows Presentation Foundation (WPF) デスクトップ アプリを .NET 8 にアップグレードする方法について説明します。 WPF はクロスプラットフォーム テクノロジである .NET 上で実行されますが、WPF は引き続き Windows 専用フレームワークです。 .NET アップグレード アシスタントでは、次の WPF 関連のプロジェクトの種類をアップグレードできます。
- WPF プロジェクト
- コントロール ライブラリ
- .NET ライブラリ
.NET Framework から .NET にアップグレードする場合は、 WPF .NET の相違点に関 する記事と 、.NET Framework から .NET への移植に関するガイドを 確認することを検討してください。
[前提条件]
- Windows オペレーティング システム
- .NET 8 を対象とする Visual Studio 2022 バージョン 17.7 以降
- .NET 7 を対象とする Visual Studio 2022 バージョン 17.1 以降
- Visual Studio 用 .NET Upgrade Assistant 拡張機能
デモ アプリ
この記事は、.NET Samples GitHub リポジトリからダウンロードできる Web お気に入りのサンプル プロジェクトをアップグレードするコンテキストで記述されています。
アップグレードを開始する
複数のプロジェクトをアップグレードする場合は、依存関係のないプロジェクトから始めます。 Web のお気に入りのサンプルでは、 WebSiteRatings プロジェクトは StarVoteControl ライブラリに依存しているため、 StarVoteControl を最初にアップグレードする必要があります。
ヒント
ソース管理やコピーなど、コードのバックアップを作成してください。
次の手順に従って Visual Studio でプロジェクトをアップグレードします。
ソリューション エクスプローラー ウィンドウで StarVoteControl プロジェクトを右クリックし、[アップグレード] を選択します。
新しいタブが開き、アップグレードの実行方法を選択するように求められます。
[インプレースのプロジェクトのアップグレード] を選択します。
次に、ターゲット フレームワークを選択します。 アップグレードするプロジェクトの種類に基づいて、さまざまなオプションが表示されます。 ライブラリが WPF などのデスクトップ テクノロジに依存せず、.NET Framework プロジェクトと .NET プロジェクトの両方で使用できる場合は、.NET Standard 2.0 が適しています。 ただし、最新の .NET リリースでは、.NET Standard よりも多くの言語とコンパイラが改善されています。
.NET 8.0 を選択し、[次へ] を選択します。
コード ファイルやライブラリなど、プロジェクトに関連するすべての成果物を含むツリーが表示されます。 個々の成果物またはプロジェクト全体 (既定) をアップグレードできます。 [Upgrade selection] (アップグレードの選択) を選択して、アップグレードを開始します。
アップグレードが完了すると、結果が表示されます。
緑で塗りつぶされた円が付けられた成果物はアップグレードされ、空の緑の円のものはスキップされました。 スキップされた成果物は、アップグレード アシスタントによってアップグレードする内容が見つからなかったものを意味します。
アプリのサポート ライブラリがアップグレードされたので、メインのアプリをアップグレードします。
アプリをアップグレードする
すべてのサポート ライブラリがアップグレードされたら、メインのアプリ プロジェクトをアップグレードできます。 次の手順を実行します。
- ソリューション エクスプローラー ウィンドウで WebSiteRatings プロジェクトを右クリックし、[アップグレード] を選択します。
- アップグレード モードとして [インプレース プロジェクト アップグレード]を選択します。
- ターゲット フレームワーク の .NET 8.0 を選択し、[ 次へ] を選択します。
- すべての成果物を選択したままにして、[ アップグレードの選択] を選択します。
アップグレードが完了すると、結果が表示されます。 項目に警告記号がある場合は、読むためのメモがあることを意味します。これは、項目を展開することで行うことができます。
クリーン ビルドを生成する
プロジェクトがアップグレードされたら、クリーンアップしてコンパイルします。
- ソリューション エクスプローラー ウィンドウで WebSiteRatings プロジェクトを右クリックし、[クリーン] を選択します。
- ソリューション エクスプローラー ウィンドウで WebSiteRatings プロジェクトを右クリックし、[ビルド] を選択します。
アプリケーションでエラーが発生した場合は、[Error List] (エラー一覧) ウィンドウで、推奨される修正方法と共にそれらを確認できます。
アップグレード後の手順
プロジェクトを .NET Framework から .NET にアップグレードする場合は、.NET Framework から .NET にアップグレードした後の Modernize に関する記事の情報を確認してください。
アップグレード後は、次の処理を行う必要があります。
NuGet パッケージを確認します。
.NET アップグレード アシスタントは、一部のパッケージを新しいバージョンにアップグレードしました。 この記事で提供されているサンプル アプリでは、
Microsoft.Data.Sqlite
NuGet パッケージが 1.0.0 から 8.0.x にアップグレードされました。 ただし、 1.0.0 はSQLite
NuGet パッケージに依存しますが、 8.0.x ではその依存関係が削除されます。SQLite
NuGet パッケージは、プロジェクトによって引き続き参照されますが、不要になりました。SQLite
パッケージとSQLite.Native
NuGet パッケージの両方をプロジェクトから削除できます。古い NuGet パッケージをクリーンアップします。
nuGet パッケージ参照がプロジェクト ファイルで宣言されたので、packages.configファイルは不要になり、プロジェクトから削除できます。 さらに、 パッケージという名前のローカル NuGet パッケージ キャッシュ フォルダーは、プロジェクトのフォルダーまたは親フォルダーにあります。 このローカル キャッシュ フォルダーは削除できます。 新しい NuGet パッケージ参照では、. nuget\packages という名前のユーザーのプロファイル ディレクトリで使用できるパッケージのグローバル キャッシュ フォルダーが使用されます。
System.Configuration
ライブラリを削除します。ほとんどの .NET Framework アプリは、
System.Configuration
ライブラリを参照しています。 アップグレード後も、このライブラリが直接参照されている可能性があります。System.Configuration
ライブラリでは、app.config ファイルを使用して、実行時の構成オプションをアプリに提供します。 .NET の場合、このライブラリはSystem.Configuration.ConfigurationManager
NuGet パッケージに置き換えられました。 ライブラリへの参照を削除し、NuGet パッケージをプロジェクトに追加します。アプリを最新化する場所を確認します。
.NET がリリースされて以来、API とライブラリは大きく変わりました。 ほとんどの場合、.NET Framework はこれらの機能強化にアクセスできません。 .NET にアップグレードすることで、よりモダンなライブラリにアクセスできるようになりました。
次のセクションでは、この記事で使用するサンプル アプリを最新化する領域について説明します。
最新化: Web ブラウザー コントロール
WPF サンプル アプリによって参照される WebBrowser コントロールは、古い Internet Explorer に基づいています。 .NET 用 WPF では、Microsoft Edge に基づく WebView2 コントロールを使用できます。 新しい WebView2 Web ブラウザー コントロールにアップグレードするには、次の手順を実行します。
Microsoft.Web.WebView2
NuGet パッケージを追加します。MainWindow.xaml ファイル内:
ルート要素の wpfControls 名前空間にコントロールをインポートします。
<mah:MetroWindow x:Class="WebSiteRatings.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:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" xmlns:local="clr-namespace:WebSiteRatings" xmlns:vm="clr-namespace:WebSiteRatings.ViewModels" xmlns:VoteControl="clr-namespace:StarVoteControl;assembly=StarVoteControl" xmlns:wpfControls="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf" Loaded="MetroWindow_Loaded" mc:Ignorable="d" Title="My Sites" Height="650" Width="1000">
<Border>
要素が宣言されている場所で、WebBrowser
コントロールを削除し、wpfControls:WebView2
コントロールに置き換えます。<Border Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" BorderThickness="1" BorderBrush="Black" Margin="5"> <wpfControls:WebView2 x:Name="browser" ScrollViewer.CanContentScroll="True" /> </Border>
MainWindow.xaml.cs のコードビハインドファイルを編集します。
ListBox_SelectionChanged
メソッドを更新して、browser.Source
プロパティを有効なUriに設定します。 このコードは、Web サイトの URL に文字列として渡されましたが、 WebView2 コントロールにはUri
が必要です。private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { var siteCollection = (ViewModels.SiteCollection)DataContext; if (siteCollection.SelectedSite != null) browser.Source = new Uri(siteCollection.SelectedSite.Url); else browser.NavigateToString("<body></body>"); }
アプリのユーザーが実行している Windows のバージョンによっては、WebView2 ランタイムのインストールが必要になる場合があります。 詳細については、「 WPF アプリでの WebView2 の概要」を参照してください。
最新化: appsettings.json
.NET Framework では 、App.config ファイルを使用して、接続文字列やログ プロバイダーなどのアプリの設定を読み込みます。 .NET では、アプリ設定に appsettings.json ファイルが使用されるようになりました。
App.config ファイルは System.Configuration.ConfigurationManager
NuGet パッケージを通じて .NET でサポートされ、 appsettings.json のサポートは Microsoft.Extensions.Configuration
NuGet パッケージによって提供されます。
他のライブラリが .NET にアップグレードされると、 App.configではなくappsettings.json をサポートすることで最新化 されます 。たとえば、.NET 6 以降用にアップグレードされた .NET Framework のログ プロバイダーは、設定 にApp.config を使用しなくなりました。 彼らの指示に従い、可能な限り App.config の使用を避けることが良いです。
WPF サンプル アプリで appsettings.json を使用する
たとえば、WPF サンプル アプリをアップグレードした後、ローカル データベースへの接続文字列 にappsettings.json を使用します。
System.Configuration.ConfigurationManager
NuGet パッケージを削除します。Microsoft.Extensions.Configuration.Json
NuGet パッケージを追加します。appsettings.jsonという名前のプロジェクトにファイル を 追加します。
出力ディレクトリにコピーする appsettings.json ファイルを設定します。
ソリューション エクスプローラーでファイルを選択した後、[プロパティ] ウィンドウを使用して、Visual Studio で出力設定にコピーを設定します。 または、プロジェクトを直接編集し、次の
ItemGroup
を追加することもできます。<ItemGroup> <Content Include="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
App.config ファイルの設定を新しい appsettings.json ファイルに移行します。
WPF サンプル アプリでは、 app.config に含まれる接続文字列は 1 つだけです。 appsettings.json ファイルを編集して接続文字列を定義します。
{ "ConnectionStrings": { "database": "DataSource=sqlite.db;" } }
App.xaml.cs ファイルを編集し、appsettings.json ファイルを読み込む構成オブジェクトをインスタンス化すると、追加された行が強調表示されます。
using System.Windows; using Microsoft.Extensions.Configuration; namespace WebSiteRatings { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { public static IConfiguration Config { get; private set; } public App() { Config = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build(); } } }
.\Models\Database.cs ファイルで、新しい
OpenConnection
プロパティを使用するようにApp.Config
メソッドを変更します。 これには、Microsoft.Extensions.Configuration
名前空間をインポートする必要があります。using Microsoft.Data.Sqlite; using System.Collections.Generic; using Microsoft.Extensions.Configuration; namespace WebSiteRatings.Models { internal class Database { public static SqliteConnection OpenConnection() => new SqliteConnection(App.Config.GetConnectionString("database")); public static IEnumerable<Site> ReadSites()
GetConnectionString
は、Microsoft.Extensions.Configuration
名前空間によって提供される拡張メソッドです。
.NET Desktop feedback