Bagian 1: Memigrasikan aplikasi Pengeluaran Contoso ke .NET Core 3

Ini adalah bagian pertama dari tutorial yang menunjukkan cara memodernisasi sampel aplikasi desktop WPF bernama Contoso Expenses. Untuk gambaran umum tutorial, prasyarat, dan instruksi untuk mengunduh aplikasi sampel, lihat Tutorial: Memodernisasi aplikasi WPF.

Di bagian tutorial ini, Anda akan memigrasikan seluruh aplikasi Pengeluaran Contoso dari .NET Framework 4.7.2 ke .NET Core 3. Sebelum Anda memulai bagian tutorial ini, pastikan Anda membuka dan membangun sampel ContosoExpenses di Visual Studio 2019.

Catatan

Untuk informasi selengkapnya tentang memigrasikan aplikasi WPF dari .NET Framework ke .NET Core 3, lihat seri blog ini.

Memigrasikan proyek ContosoExpenses ke .NET Core 3

Di bagian ini, Anda akan memigrasikan proyek ContosoExpenses di aplikasi Pengeluaran Contoso ke .NET Core 3. Anda akan melakukan ini dengan membuat file proyek baru yang berisi file yang sama dengan proyek ContosoExpenses yang ada tetapi menargetkan .NET Core 3 alih-alih .NET Framework 4.7.2. Ini memungkinkan Anda mempertahankan satu solusi dengan versi .NET Framework dan .NET Core aplikasi.

  1. Verifikasi bahwa proyek ContosoExpenses saat ini menargetkan .NET Framework 4.7.2. Di Penjelajah Solusi, klik kanan proyek ContosoExpenses, pilih Properti, dan konfirmasikan bahwa properti Kerangka kerja target pada tab Aplikasi diatur ke .NET Framework 4.7.2.

    .NET Framework version 4.7.2 for the project

  2. Di Windows Explorer, navigasikan ke folder C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses dan buat file teks baru bernama ContosoExpenses.Core.csproj.

  3. Klik kanan pada file, pilih Buka dengan, lalu buka di editor teks pilihan Anda, seperti Notepad, Visual Studio Code, atau Visual Studio.

  4. Salin teks berikut ke file dan simpan.

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <UseWPF>true</UseWPF>
     </PropertyGroup>
    
    </Project>
    
  5. Tutup file dan kembali ke solusi ContosoExpenses di Visual Studio.

  6. Klik kanan solusi ContosoExpenses dan pilih Tambahkan -> Proyek yang Ada. Pilih file ContosoExpenses.Core.csproj yang baru saja Anda buat di C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses folder untuk menambahkannya ke solusi.

ContosoExpenses.Core.csproj mencakup elemen-elemen berikut:

  • Elemen Project menentukan versi SDK Microsoft.NET.Sdk.WindowsDesktop. Ini mengacu pada aplikasi .NET untuk Windows Desktop, dan mencakup komponen untuk aplikasi WPF dan Formulir Windows.
  • Elemen PropertyGroup berisi elemen turunan yang menunjukkan output proyek dapat dieksekusi (bukan DLL), menargetkan .NET Core 3, dan menggunakan WPF. Untuk aplikasi Formulir Windows, Anda akan menggunakan elemen UseWinForms alih-alih elemen UseWPF.

Catatan

Saat bekerja dengan format .csproj yang diperkenalkan dengan .NET Core 3.0, semua file dalam folder yang sama dengan .csproj dianggap sebagai bagian dari proyek. Oleh karena itu, Anda tidak perlu menentukan setiap file yang disertakan dalam proyek. Anda hanya harus menentukan file yang ingin Anda tentukan tindakan build kustomnya atau yang ingin Anda kecualikan.

Memigrasikan proyek ContosoExpenses.Data ke .NET Standard

Solusi ContosoExpenses mencakup pustaka kelas ContosoExpenses.Data yang berisi model dan antarmuka untuk layanan dan target .NET 4.7.2. Aplikasi .NET Core 3.0 dapat menggunakan pustaka .NET Framework, selama tidak menggunakan API yang tidak tersedia di .NET Core. Namun, jalur modernisasi terbaik adalah memindahkan pustaka Anda ke .NET Standard. Ini akan memastikan bahwa pustaka Anda didukung sepenuhnya oleh aplikasi .NET Core 3.0 Anda. Selain itu, Anda dapat menggunakan kembali pustaka juga dengan platform lain, seperti web (melalui ASP.NET Core) dan seluler (melalui Xamarin).

Untuk memigrasikan proyek ContosoExpenses.Data ke .NET Standard:

  1. Di Visual Studio, klik kanan proyek ContosoExpenses.Data dan pilih Bongkar Proyek. Klik kanan proyek lagi lalu pilih Edit ContosoExpenses.Data.csproj.

  2. Hapus seluruh isi file proyek.

  3. Salin dan tempel XML berikut dan simpan file.

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    
  4. Klik kanan proyek ContosoExpenses.Data dan pilih Muat Ulang Proyek.

Mengonfigurasi paket dan dependensi NuGet

Saat Anda memigrasikan proyek ContosoExpenses.Core dan ContosoExpenses.Data di bagian sebelumnya, Anda menghapus referensi paket NuGet dari proyek. Di bagian ini, Anda akan menambahkan referensi ini kembali.

Untuk mengonfigurasi paket NuGet untuk proyek ContosoExpenses.Data :

  1. Dalam proyek ContosoExpenses.Data, perluas simpul Dependensi. Perhatikan bahwa bagian NuGet hilang.

    NuGet packages

    Jika Anda membuka Packages.config di Penjelajah Solusi Anda akan menemukan referensi 'lama' dari paket NuGet yang digunakan proyek saat menggunakan .NET Framework lengkap.

    Dependencies and packages

    Berikut adalah konten file Packages.config . Anda akan melihat bahwa semua Paket NuGet menargetkan Full .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. Dalam proyek ContosoExpenses.Data, hapus file Packages.config.

  3. Dalam proyek ContosoExpenses.Data, klik kanan simpul Dependensi dan pilih Kelola Paket NuGet.

Manage NuGet Packages...

  1. Di jendela Manajer Paket NuGet, klik Telusuri. Cari Bogus paket dan instal versi stabil terbaru.

    Bogus NuGet package

  2. Cari LiteDB paket dan instal versi stabil terbaru.

    LiteDB NuGet package

    Anda mungkin bertanya-tanya di mana daftar paket NuGet ini disimpan, karena proyek tidak lagi memiliki file packages.config. Paket NuGet yang dirujuk disimpan langsung dalam file .csproj. Anda dapat memeriksa ini dengan melihat konten file proyek ContosoExpenses.Data.csproj di editor teks. Anda akan menemukan baris berikut yang ditambahkan di akhir file:

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

    Catatan

    Anda mungkin juga melihat bahwa Anda menginstal paket yang sama untuk proyek .NET Core 3 ini seperti yang digunakan oleh proyek .NET Framework 4.7.2. Paket NuGet mendukung multi-penargetan. Penulis pustaka dapat menyertakan versi pustaka yang berbeda dalam paket yang sama, yang dikompilasi untuk arsitektur dan platform yang berbeda. Paket-paket ini mendukung .NET Framework lengkap serta .NET Standard 2.0, yang kompatibel dengan proyek .NET Core 3. Untuk informasi selengkapnya tentang perbedaan .NET Framework, .NET Core dan .NET Standard, lihat .NET Standard.

Untuk mengonfigurasi paket NuGet untuk proyek ContosoExpenses.Core :

  1. Dalam proyek ContosoExpenses.Core, buka file packages.config. Perhatikan bahwa saat ini berisi referensi berikut yang menargetkan .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>
    

    Dalam langkah-langkah berikut, Anda akan .NET Standard versi MvvmLightLibs paket dan Unity . Dua lainnya adalah dependensi yang diunduh secara otomatis oleh NuGet saat Anda menginstal dua pustaka ini.

  2. Dalam proyek ContosoExpenses.Core, hapus file Packages.config.

  3. Klik kanan proyek ContosoExpenses.Core dan pilih Kelola Paket NuGet.

  4. Di jendela Manajer Paket NuGet, klik Telusuri. Cari Unity paket dan instal versi stabil terbaru.

    Unity package

  5. Cari MvvmLightLibsStd10 paket dan instal versi stabil terbaru. Ini adalah versi .NET Standard dari MvvmLightLibs paket. Untuk paket ini, penulis memilih untuk mengemas versi .NET Standard pustaka dalam paket terpisah daripada versi .NET Framework.

    MvvmLightsLibs package

  6. Dalam proyek ContosoExpenses.Core, klik kanan simpul Dependensi dan pilih Tambahkan Referensi.

  7. Dalam kategori Solusi Proyek>, pilih ContosoExpenses.Data dan klik OK.

    Add Reference

Menonaktifkan atribut assembly yang dibuat secara otomatis

Pada titik ini dalam proses migrasi, jika Anda mencoba membangun proyek ContosoExpenses.Core , Anda akan melihat beberapa kesalahan.

.NET Core 3 build new errors

Masalah ini terjadi karena format .csproj baru yang diperkenalkan dengan .NET Core 3.0 menyimpan info perakitan dalam file proyek daripada file AssemblyInfo.cs . Untuk memperbaiki kesalahan ini, nonaktifkan perilaku ini dan biarkan proyek terus menggunakan file AssemblyInfo.cs .

  1. Di Visual Studio, klik kanan proyek ContosoExpenses.Core dan pilih Bongkar Proyek. Klik kanan proyek lagi lalu pilih Edit ContosoExpenses.Core.csproj.

  2. Tambahkan elemen berikut di bagian PropertyGroup dan simpan file.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Setelah menambahkan elemen ini, bagian PropertyGroup sekarang akan terlihat seperti ini:

    <PropertyGroup>
      <OutputType>WinExe</OutputType>
      <TargetFramework>netcoreapp3.0</TargetFramework>
      <UseWPF>true</UseWPF>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  3. Klik kanan proyek ContosoExpenses.Core dan pilih Muat Ulang Proyek.

  4. Klik kanan proyek ContosoExpenses.Data dan pilih Bongkar Proyek. Klik kanan proyek lagi lalu pilih Edit ContosoExpenses.Data.csproj.

  5. Tambahkan entri yang sama di bagian PropertyGroup dan simpan file.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Setelah menambahkan elemen ini, bagian PropertyGroup sekarang akan terlihat seperti ini:

    <PropertyGroup>
      <TargetFramework>netstandard2.0</TargetFramework>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  6. Klik kanan proyek ContosoExpenses.Data dan pilih Muat Ulang Proyek.

Menambahkan Paket Kompatibilitas Windows

Jika sekarang Anda mencoba mengkompilasi proyek ContosoExpenses.Core dan ContosoExpenses.Data , Anda akan melihat bahwa kesalahan sebelumnya sekarang diperbaiki tetapi masih ada beberapa kesalahan di pustaka ContosoExpenses.Data yang mirip dengan ini.

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

Kesalahan ini adalah hasil dari mengonversi proyek ContosoExpenses.Data dari pustaka .NET Framework (yang khusus untuk Windows) ke pustaka Standar .NET, yang dapat berjalan di beberapa platform termasuk Linux, Android, iOS, dan banyak lagi. Proyek ContosoExpenses.Data berisi kelas yang disebut RegistryService, yang berinteraksi dengan registri, konsep khusus Windows.

Untuk mengatasi kesalahan ini, instal paket Windows Compatibility NuGet. Paket ini menyediakan dukungan untuk banyak API khusus Windows yang akan digunakan dalam pustaka Standar .NET. Pustaka tidak akan lagi menjadi lintas platform setelah menggunakan paket ini, tetapi masih akan menargetkan .NET Standard.

  1. Klik kanan pada proyek ContosoExpenses.Data .

  2. Pilih Manage NuGet Packages (Kelola Paket NuGet).

  3. Di jendela Manajer Paket NuGet, klik Telusuri. Cari Microsoft.Windows.Compatibility paket dan instal versi stabil terbaru.

    Install NuGet package

  4. Sekarang coba lagi untuk mengkompilasi proyek, dengan mengklik kanan pada proyek ContosoExpenses.Data dan memilih Build.

Kali ini proses build akan selesai tanpa kesalahan.

Menguji dan men-debug migrasi

Sekarang setelah proyek berhasil dibangun, Anda siap untuk menjalankan dan menguji aplikasi untuk melihat apakah ada kesalahan runtime.

  1. Klik kanan proyek ContosoExpenses.Core dan pilih Atur sebagai Proyek Startup.

  2. Tekan F5 untuk memulai proyek ContosoExpenses.Core di debugger. Anda akan melihat pengecualian yang mirip dengan yang berikut ini.

    Exception displayed in Visual Studio

    Pengecualian ini sedang dimunculkan karena ketika Anda menghapus konten dari file .csproj di awal migrasi, Anda menghapus informasi tentang tindakan Build untuk file gambar. Langkah-langkah berikut memperbaiki masalah ini.

  3. Hentikan debugger.

  4. Klik kanan proyek ContosoExpenses.Core dan pilih Bongkar Proyek. Klik kanan proyek lagi lalu pilih Edit ContosoExpenses.Core.csproj.

  5. Sebelum elemen Proyek penutup, tambahkan entri berikut:

    <ItemGroup>
      <Content Include="Images/*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
  6. Klik kanan proyek ContosoExpenses.Core dan pilih Muat Ulang Proyek.

  7. Untuk menetapkan Contoso.ico ke aplikasi, klik kanan proyek ContosoExpenses.Core dan pilih Properti. Di halaman yang dibuka, klik drop-down di bawah Ikon dan pilih Images\contoso.ico.

    Contoso icon in the Project's Properties

  8. Klik Simpan.

  9. Tekan F5 untuk memulai proyek ContosoExpenses.Core di debugger. Konfirmasikan bahwa aplikasi sekarang berjalan.

Langkah berikutnya

Pada titik ini dalam tutorial, Anda telah berhasil memigrasikan aplikasi Pengeluaran Contoso ke .NET Core 3. Anda sekarang siap untuk Bagian 2: Tambahkan kontrol UWP InkCanvas menggunakan Kepulauan XAML.

Catatan

Jika Anda memiliki layar resolusi tinggi, Anda mungkin melihat bahwa aplikasi terlihat sangat kecil. Anda akan mengatasi masalah ini di langkah tutorial berikutnya.