次の方法で共有


パート 1: Contoso Expenses アプリを .NET Core 3 に移行する

これは、Contoso Expenses という名前のサンプル WPF デスクトップ アプリを最新化する方法を示すチュートリアルの最初の部分です。 チュートリアルの概要、前提条件、サンプル アプリをダウンロードする手順については、「 チュートリアル: WPF アプリの最新化」を参照してください。

チュートリアルのこの部分では、Contoso Expenses アプリ全体を .NET Framework 4.7.2 から .NET Core 3 に移行します。 このチュートリアルのこの部分を開始する前に、Visual Studio 2019 で ContosoExpenses サンプルを 開いて ビルドすることを確認してください。

WPF アプリケーションを .NET Framework から .NET Core 3 に移行する方法の詳細については、 このブログ シリーズを参照してください。

ContosoExpenses プロジェクトを .NET Core 3 に移行する

このセクションでは、Contoso Expenses アプリの ContosoExpenses プロジェクトを .NET Core 3 に移行します。 これを行うには、既存の ContosoExpenses プロジェクトと同じファイルを含むが、.NET Framework 4.7.2 ではなく .NET Core 3 を対象とする新しいプロジェクト ファイルを作成します。 これにより、.NET Framework と .NET Core の両方のバージョンのアプリで 1 つのソリューションを維持できます。

  1. ContosoExpenses プロジェクトが現在 .NET Framework 4.7.2 をターゲットにしていることを確認します。 ソリューション エクスプローラーで ContosoExpenses プロジェクトを右クリックし、[プロパティ] を選択し、[アプリケーション] タブの [ターゲット フレームワーク] プロパティが .NET Framework 4.7.2 に設定されていることを確認します。

    プロジェクト の .NET Framework バージョン 4.7.2 を実行するために を使用する

  2. Windows エクスプローラーで 、C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses フォルダーに移動し、 ContosoExpenses.Core.csproj という名前の新しいテキスト ファイルを作成します。

  3. ファイルを右クリックし、[ 開く] を選択して、任意のテキスト エディター (メモ帳、Visual Studio Code、Visual Studio など) で開きます。

  4. 次のテキストをファイルにコピーして保存します。

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <UseWPF>true</UseWPF>
     </PropertyGroup>
    
    </Project>
    
  5. ファイルを閉じて、Visual Studio で ContosoExpenses ソリューションに戻ります。

  6. ContosoExpenses ソリューションを右クリックし、[追加 -> 既存のプロジェクト]を選択します。 フォルダーに作成した C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses ファイルを選択して、ソリューションに追加します。

ContosoExpenses.Core.csproj には、次の要素が含まれています。

  • Project 要素は、Microsoft.NET.Sdk.WindowsDesktop の SDK バージョンを指定します。 これは、Windows デスクトップ用の .NET アプリケーションを指し、WPF および Windows フォーム アプリのコンポーネントが含まれています。
  • PropertyGroup 要素には、プロジェクトの出力が実行可能ファイル (DLL ではない) であることを示す子要素が含まれており、.NET Core 3 を対象とし、WPF を使用します。 Windows フォーム アプリの場合は、UseWinForms 要素を使用し、UseWPF 要素ではありません。

.NET Core 3.0 で導入された .csproj 形式を使用する場合、.csproj と同じフォルダー内のすべてのファイルがプロジェクトの一部と見なされます。 そのため、プロジェクトに含まれるすべてのファイルを指定する必要はありません。 カスタム ビルド アクションを定義するファイル、または除外するファイルのみを指定する必要があります。

ContosoExpenses.Data プロジェクトを .NET Standard に移行する

ContosoExpenses ソリューションには、サービスおよびターゲット .NET 4.7.2 のモデルとインターフェイスを含む ContosoExpenses.Data クラス ライブラリが含まれています。 .NET Core 3.0 アプリは、.NET Core で使用できない API を使用しない限り、.NET Framework ライブラリを使用できます。 ただし、最新化の最適なパスは、ライブラリを .NET Standard に移動する方法です。 これにより、ライブラリが .NET Core 3.0 アプリで完全にサポートされるようになります。 さらに、(ASP.NET Core を介して) Web などの他のプラットフォームでもライブラリを再利用できます。

ContosoExpenses.Data プロジェクトを .NET Standard に移行するには:

  1. Visual Studio で、ContosoExpenses.Data プロジェクト 右クリックし、[プロジェクトのアンロード]選択します。 プロジェクトをもう一度右クリックし、[ ContosoExpenses.Data.csproj の編集] を選択します。

  2. プロジェクト ファイルの内容全体を削除します。

  3. 次の XML をコピーして貼り付け、ファイルを保存します。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    
  4. ContosoExpenses.Data プロジェクトを右クリックして、[プロジェクトの再読み込み] を選択します。

NuGet パッケージと依存関係を構成する

ContosoExpenses.Core を移行し、前のセクションで ContosoExpenses.Data プロジェクトを すると、NuGet パッケージ参照がプロジェクトから削除されました。 このセクションでは、これらの参照を再度追加します。

ContosoExpenses.Data プロジェクトの NuGet パッケージを構成するには:

  1. ContosoExpenses.Data プロジェクトで、[依存関係] ノードを展開します。 NuGet セクションが見つからないことに注意してください。

    NuGet パッケージ

    ソリューション エクスプローラーPackages.config を開くと、完全な .NET Framework を使用しているときにプロジェクトを使用した NuGet パッケージの "古い" 参照が見つかります。

    依存関係とパッケージ

    Packages.configファイルの内容を次 に示 します。 すべての NuGet パッケージが完全な .NET Framework 4.7.2 を対象としていることがわかります。

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="Bogus" version="26.0.2" targetFramework="net472" />
      <package id="LiteDB" version="4.1.4" targetFramework="net472" />
    </packages>
    
  2. ContosoExpenses.Data プロジェクトでPackages.config ファイルを削除します。

  3. ContosoExpenses.Data プロジェクトで、依存関係 ノードを右クリックして、[NuGet パッケージの管理] を選択します。

NuGet パッケージの管理...

  1. NuGet パッケージ マネージャー ウィンドウで、[参照]をクリックします。 Bogus パッケージを検索し、最新の安定バージョンをインストールします。

    Bogus NuGet パッケージ

  2. LiteDB パッケージを検索し、最新の安定バージョンをインストールします。

    LiteDB NuGet パッケージ

    プロジェクトには packages.config ファイルがないため、これらの NuGet パッケージの一覧がどこに格納されているか疑問に思うかもしれません。 参照される NuGet パッケージは、.csproj ファイルに直接格納されます。 これを確認するには、テキスト エディターで ContosoExpenses.Data.csproj プロジェクト ファイルの内容を表示します。 ファイルの末尾に次の行が追加されています。

    <ItemGroup>
       <PackageReference Include="Bogus" Version="26.0.2" />
       <PackageReference Include="LiteDB" Version="4.1.4" />
    </ItemGroup>
    

    また、.NET Framework 4.7.2 プロジェクトで使用されるパッケージと同じパッケージをこの .NET Core 3 プロジェクトにインストールしていることにも気付くかもしれません。 NuGet パッケージでは、マルチターゲットがサポートされています。 ライブラリ作成者は、異なるアーキテクチャとプラットフォーム用にコンパイルされた同じパッケージ内に、異なるバージョンのライブラリを含めることができます。 これらのパッケージは、.NET Core 3 プロジェクトと互換性のある完全な .NET Framework と .NET Standard 2.0 をサポートします。 .NET Framework、.NET Core、.NET Standard の違いの詳細については、「 .NET Standard」を参照してください。

ContosoExpenses.Core プロジェクトの NuGet パッケージを構成するには:

  1. ContosoExpenses.Core プロジェクトで、packages.config ファイルを開きます。 現在、.NET Framework 4.7.2 を対象とする次の参照が含まれていることに注意してください。

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="CommonServiceLocator" version="2.0.2" targetFramework="net472" />
      <package id="MvvmLightLibs" version="5.4.1.1" targetFramework="net472" />
      <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" />
      <package id="Unity" version="5.10.2" targetFramework="net472" />
    </packages>
    

    次の手順では、.NET Standard バージョンの MvvmLightLibs パッケージと Unity パッケージについて説明します。 他の 2 つの依存関係は、これら 2 つのライブラリをインストールするときに NuGet によって自動的にダウンロードされます。

  2. ContosoExpenses.Core プロジェクトで、Packages.config ファイルを削除します。

  3. ContosoExpenses.Core プロジェクトを右クリックし、[NuGet パッケージの管理] を選択します。

  4. NuGet パッケージ マネージャー ウィンドウで、[参照]をクリックします。 Unity パッケージを検索し、最新の安定バージョンをインストールします。

    Unity パッケージ

  5. MvvmLightLibsStd10 パッケージを検索し、最新の安定バージョンをインストールします。 これは、 MvvmLightLibs パッケージの .NET Standard バージョンです。 このパッケージでは、作成者はライブラリの .NET Standard バージョンを .NET Framework バージョンとは別のパッケージにパッケージ化することを選択しました。

    MvvmLightsLibs パッケージ の

  6. ContosoExpenses.Core プロジェクトで、[依存関係] ノードを右クリックし、[参照の追加] を選択します。

  7. [プロジェクト > ソリューション] カテゴリで、[ContosoExpenses.Data] を選択し、[OK] をクリックします

    参照を追加

自動生成されたアセンブリ属性を無効にする

移行プロセスのこの時点で、 ContosoExpenses.Core プロジェクトをビルドしようとすると、いくつかのエラーが表示されます。

.NET Core 3 のビルドで発生する新しいエラー

この問題が発生するのは、.NET Core 3.0 で導入された新しい .csproj 形式が、 AssemblyInfo.cs ファイルではなくプロジェクト ファイルにアセンブリ情報を格納するためです。 これらのエラーを修正するには、この動作を無効にして、プロジェクトで引き続き AssemblyInfo.cs ファイルを使用できるようにします。

  1. Visual Studio で、ContosoExpenses.Core プロジェクトを右クリックし、[プロジェクトのアンロード] を選択します。 プロジェクトをもう一度右クリックし、[ ContosoExpenses.Core.csproj の編集] を選択します。

  2. PropertyGroup セクションに次の要素を追加し、ファイルを保存します。

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    この要素を追加すると、 PropertyGroup セクションは次のようになります。

    <PropertyGroup>
      <OutputType>WinExe</OutputType>
      <TargetFramework>netcoreapp3.0</TargetFramework>
      <UseWPF>true</UseWPF>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  3. ContosoExpenses.Core プロジェクトを右クリックして、[プロジェクトの再読み込み]を選択します。

  4. ContosoExpenses.Data プロジェクトを右クリックし、[プロジェクトのアンロード]を選択します。 プロジェクトをもう一度右クリックし、[ ContosoExpenses.Data.csproj の編集] を選択します。

  5. PropertyGroup セクションに同じエントリを追加し、ファイルを保存します。

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    この要素を追加すると、 PropertyGroup セクションは次のようになります。

    <PropertyGroup>
      <TargetFramework>netstandard2.0</TargetFramework>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  6. ContosoExpenses.Data プロジェクトを右クリックして、[プロジェクトの再読み込み] を選択します。

Windows 互換機能パックを追加する

ContosoExpenses.CoreContosoExpenses.Data プロジェクトをコンパイルしようとすると、以前のエラーは修正されていますが、ContosoExpenses.Data ライブラリには依然として以下のようなエラーが残っていることがわかります。

Services\RegistryService.cs(9,26,9,34): error CS0103: The name 'Registry' does not exist in the current context Services\RegistryService.cs(12,26,12,34): error CS0103: The name 'Registry' does not exist in the current context Services\RegistryService.cs(12,97,12,123): error CS0103: The name 'RegistryKeyPermissionCheck' does not exist in the current context

これらのエラーは、 ContosoExpenses.Data プロジェクトを .NET Framework ライブラリ (Windows に固有) から .NET Standard ライブラリに変換した結果です。これは、Linux、Android、iOS などの複数のプラットフォームで実行できます。 ContosoExpenses.Data プロジェクトには、レジストリと対話する RegistryService という名前のクラスが含まれています。これは、Windows 専用の概念です。

これらのエラーを解決するには、 Windows 互換性 NuGet パッケージをインストールします。 このパッケージは、.NET Standard ライブラリで使用される多くの Windows 固有 API のサポートを提供します。 このパッケージを使用した後、ライブラリはクロスプラットフォームではなくなりますが、.NET Standard は引き続き対象となります。

  1. ContosoExpenses.Data プロジェクトを右クリックします。

  2. [NuGet パッケージ管理]を選択します。

  3. NuGet パッケージ マネージャー ウィンドウで、[参照]をクリックします。 Microsoft.Windows.Compatibility パッケージを検索し、最新の安定バージョンをインストールします。

    NuGet パッケージ をインストールする

  4. 次に、ContosoExpenses.Data プロジェクトを右クリックし、もう一度 ビルドを選択して、プロジェクトをコンパイルします。

今回は、エラーなしでビルド プロセスが完了します。

移行をテストしてデバッグする

プロジェクトが正常にビルドされたので、アプリを実行してテストして、ランタイム エラーがあるかどうかを確認する準備ができました。

  1. ContosoExpenses.Core プロジェクトを右クリックし、[スタートアップ プロジェクトとして設定] を選択します。

  2. F5 キーを押して、デバッガーで ContosoExpenses.Core プロジェクトを開始します。 次のような例外が表示されます。

    Visual Studio に表示される例外

    移行の開始時に .csproj ファイルからコンテンツを削除すると、イメージ ファイルの ビルド アクション に関する情報が削除されたため、この例外が発生しています。 次の手順で、この問題を解決します。

  3. デバッガーを停止します。

  4. ContosoExpenses.Core プロジェクトを右クリックし、[プロジェクトのアンロード] を選択します。 プロジェクトをもう一度右クリックし、[ ContosoExpenses.Core.csproj の編集] を選択します。

  5. 終了する Project 要素の前に、次のエントリを追加します。

    <ItemGroup>
      <Content Include="Images/*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
  6. ContosoExpenses.Core プロジェクトを右クリックして、[プロジェクトの再読み込み]を選択します。

  7. Contoso.icoをアプリに割り当てるには、 ContosoExpenses.Core プロジェクトを右クリックし、[プロパティ] を選択 します。 開いたページで、[ アイコン ] の下にあるドロップダウンをクリックし、[ Images\contoso.ico] を選択します。

    プロジェクトのプロパティの [Contoso] アイコン を確認します

  8. [保存] をクリックします。

  9. F5 キーを押して、デバッガーで ContosoExpenses.Core プロジェクトを開始します。 アプリが実行されていることを確認します。

次のステップ

チュートリアルのこの時点で、Contoso Expenses アプリが .NET Core 3 に正常に移行されました。 これで、パート 2: XAML Islands を使用して UWP InkCanvas コントロールを追加する準備ができました。

高解像度の画面がある場合は、アプリが非常に小さく見える場合があります。 この問題は、チュートリアルの次の手順で対処します。