Udostępnij przez


Część 1. Migrowanie aplikacji Wydatki firmy Contoso do platformy .NET Core 3

Jest to pierwsza część samouczka, który pokazuje, jak zmodernizować przykładową aplikację klasyczną WPF o nazwie Contoso Expenses. Aby zapoznać się z omówieniem samouczka, wymagań wstępnych i instrukcji dotyczących pobierania przykładowej aplikacji, zobacz Tutorial: Modernize a WPF app.

W tej części samouczka przeprowadzisz migrację całej aplikacji Contoso Expenses z programu .NET Framework 4.7.2 do platformy .NET Core 3. Przed rozpoczęciem tej części samouczka upewnij się, że otwórz i skompiluj przykład ContosoExpenses w programie Visual Studio 2019.

Uwaga / Notatka

Aby uzyskać więcej informacji na temat migrowania aplikacji WPF z programu .NET Framework do platformy .NET Core 3, zobacz tę serię blogów.

Migrowanie projektu ContosoExpenses do platformy .NET Core 3

W tej sekcji przeprowadzisz migrację projektu ContosoExpenses w aplikacji Wydatki firmy Contoso do platformy .NET Core 3. W tym celu utworzysz nowy plik projektu zawierający te same pliki co istniejący projekt ContosoExpenses, ale jest przeznaczony dla platformy .NET Core 3 zamiast programu .NET Framework 4.7.2. Dzięki temu można obsługiwać pojedyncze rozwiązanie zarówno w wersjach .NET Framework, jak i .NET Core aplikacji.

  1. Sprawdź, czy projekt ContosoExpenses jest obecnie przeznaczony dla programu .NET Framework 4.7.2. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt ContosoExpenses, wybierz Właściwościi upewnij się, że właściwość platformy docelowej na karcie Application jest ustawiona na platformę .NET Framework 4.7.2.

    .NET Framework w wersji 4.7.2 dla projektu

  2. W Eksploratorze Windows przejdź do folderu C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses i utwórz nowy plik tekstowy o nazwie ContosoExpenses.Core.csproj.

  3. Kliknij plik prawym przyciskiem myszy, wybierz polecenie Otwórz za pomocą, a następnie otwórz go w wybranym edytorze tekstów, takim jak Notatnik, Visual Studio Code lub Visual Studio.

  4. Skopiuj następujący tekst do pliku i zapisz go.

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <UseWPF>true</UseWPF>
     </PropertyGroup>
    
    </Project>
    
  5. Zamknij plik i wróć do rozwiązania ContosoExpenses w programie Visual Studio.

  6. Kliknij prawym przyciskiem myszy rozwiązanie ContosoExpenses i wybierz Dodaj —> Istniejący Projekt. Wybierz plik ContosoExpenses.Core.csproj, który właśnie utworzyłeś w folderze C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses, aby dodać go do rozwiązania.

ContosoExpenses.Core.csproj zawiera następujące elementy:

  • Element Project określa wersję zestawu SDK zestawu Microsoft.NET.Sdk.WindowsDesktop. Dotyczy to aplikacji .NET dla komputerów z systemem Windows i zawiera składniki dla aplikacji WPF i Windows Forms.
  • Element PropertyGroup zawiera elementy podrzędne, które wskazują, że dane wyjściowe projektu to plik wykonywalny (a nie biblioteka DLL), który jest kierowany na .NET Core 3 i korzysta z WPF. W przypadku aplikacji Windows Forms należy użyć elementu UseWinForms zamiast elementu UseWPF .

Uwaga / Notatka

Podczas pracy z formatem csproj wprowadzonym w programie .NET Core 3.0 wszystkie pliki w tym samym folderze co plik csproj są uznawane za część projektu. W związku z tym nie trzeba określać każdego pliku zawartego w projekcie. Musisz określić tylko te pliki, dla których chcesz zdefiniować niestandardową akcję kompilacji lub które chcesz wykluczyć.

Migrowanie projektu ContosoExpenses.Data do platformy .NET Standard

Rozwiązanie ContosoExpenses zawiera bibliotekę klas ContosoExpenses.Data, która zawiera modele i interfejsy do usług i celów na platformie .NET 4.7.2. Aplikacje platformy .NET Core 3.0 mogą używać bibliotek .NET Framework, o ile nie korzystają z interfejsów API, które nie są dostępne na platformie .NET Core. Jednak najlepszą ścieżką modernizacji jest przeniesienie bibliotek do platformy .NET Standard. Dzięki temu biblioteka jest w pełni obsługiwana przez aplikację .NET Core 3.0. Ponadto możesz ponownie użyć biblioteki również z innymi platformami, takimi jak internet (za pośrednictwem ASP.NET Core).

Aby przeprowadzić migrację projektu ContosoExpenses.Data do platformy .NET Standard:

  1. W programie Visual Studio kliknij prawym przyciskiem myszy projekt ContosoExpenses.Data i wybierz Zwolnij projekt. Ponownie kliknij prawym przyciskiem myszy projekt, a następnie wybierz pozycję Edytuj ContosoExpenses.Data.csproj.

  2. Usuń całą zawartość pliku projektu.

  3. Skopiuj i wklej następujący kod XML i zapisz plik.

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    
  4. Kliknij prawym przyciskiem myszy projekt ContosoExpenses.Data i wybierz polecenie Załaduj ponownie projekt.

Konfigurowanie pakietów NuGet i zależności

Podczas migracji projektów ContosoExpenses.Core i ContosoExpenses.Data w poprzednich sekcjach, usunąłeś odwołania do pakietów NuGet z projektów. W tej sekcji dodasz te odwołania z powrotem.

Aby skonfigurować pakiety NuGet dla projektu ContosoExpenses.Data:

  1. W projekcie ContosoExpenses.Data rozwiń węzeł Zależności. Zwróć uwagę, że sekcja NuGet jest brakująca.

    pakietów NuGet

    Jeśli otworzysz Packages.config w Eksploratorze rozwiązań , znajdziesz stare odwołania do pakietów NuGet używanych przez projekt, gdy korzystał z pełnego .NET Framework.

    Zależności i pakiety

    Oto zawartość pliku Packages.config . Zauważysz, że wszystkie pakiety NuGet są przeznaczone dla pełnego programu .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. W projekcie ContosoExpenses.Data usuń plik Packages.config .

  3. W projekcie ContosoExpenses.Data kliknij prawym przyciskiem myszy węzeł zależności i wybierz Zarządzaj pakietami NuGet.

Zarządzaj pakietami NuGet...

  1. W oknie menedżera pakietów NuGet kliknij pozycję Przeglądaj. Bogus Wyszukaj pakiet i zainstaluj najnowszą stabilną wersję.

    pakiet NuGet Bogus

  2. LiteDB Wyszukaj pakiet i zainstaluj najnowszą stabilną wersję.

    pakiet NuGet LiteDB

    Być może zastanawiasz się, gdzie jest przechowywana lista pakietów NuGet, ponieważ projekt nie ma już pliku packages.config. Przywołyne pakiety NuGet są przechowywane bezpośrednio w pliku csproj. Możesz to sprawdzić, wyświetlając zawartość pliku projektu ContosoExpenses.Data.csproj w edytorze tekstów. Na końcu pliku znajdują się następujące wiersze:

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

    Uwaga / Notatka

    Możesz również zauważyć, że instalujesz te same pakiety dla tego projektu platformy .NET Core 3 jako te używane przez projekty programu .NET Framework 4.7.2. Pakiety NuGet obsługują wiele elementów docelowych. Autorzy bibliotek mogą zawierać różne wersje biblioteki w tym samym pakiecie, skompilowane dla różnych architektur i platform. Te pakiety obsługują pełny program .NET Framework, a także .NET Standard 2.0, który jest zgodny z projektami platformy .NET Core 3. Aby uzyskać więcej informacji na temat różnic w programach .NET Framework, .NET Core i .NET Standard, zobacz .NET Standard.

Aby skonfigurować pakiety NuGet dla projektu ContosoExpenses.Core:

  1. W projekcie ContosoExpenses.Core otwórz plik packages.config . Zwróć uwagę, że obecnie zawiera ona następujące odwołania przeznaczone dla programu .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>
    

    W poniższych krokach poznasz wersje .NET Standard dla pakietów MvvmLightLibs i Unity. Pozostałe dwa są zależnościami automatycznie pobieranymi przez NuGet podczas instalowania tych dwóch bibliotek.

  2. W projekcie ContosoExpenses.Core usuń plik Packages.config .

  3. Kliknij prawym przyciskiem myszy projekt ContosoExpenses.Core i wybierz Zarządzaj pakietami NuGet.

  4. W oknie menedżera pakietów NuGet kliknij pozycję Przeglądaj. Unity Wyszukaj pakiet i zainstaluj najnowszą stabilną wersję.

    pakiet Unity

  5. MvvmLightLibsStd10 Wyszukaj pakiet i zainstaluj najnowszą stabilną wersję. Jest to wersja MvvmLightLibs pakietu .NET Standard. W przypadku tego pakietu autor zdecydował się spakować wersję biblioteki .NET Standard w osobnym pakiecie niż wersja programu .NET Framework.

    pakiet MvvmLightsLibs

  6. W projekcie ContosoExpenses.Core kliknij prawym przyciskiem myszy węzeł zależności i wybierz Dodaj odwołanie.

  7. W kategorii Projects > Solution wybierz element ContosoExpenses.Data i kliknij przycisk OK.

    Dodaj odwołanie

Wyłącz automatycznie generowane atrybuty zestawu

W tym momencie procesu migracji, jeśli spróbujesz skompilować projekt ContosoExpenses.Core , zobaczysz pewne błędy.

nowe błędy kompilacji .NET Core 3

Ten problem występuje, ponieważ nowy format csproj wprowadzony w programie .NET Core 3.0 przechowuje informacje o zestawie w pliku projektu, a nie w pliku AssemblyInfo.cs . Aby naprawić te błędy, wyłącz to zachowanie i pozwól projektowi nadal używać pliku AssemblyInfo.cs .

  1. W programie Visual Studio kliknij prawym przyciskiem myszy projekt ContosoExpenses.Core i wybierz Wyładuj projekt. Kliknij ponownie prawym przyciskiem projekt, a następnie wybierz Edytuj ContosoExpenses.Core.csproj.

  2. Dodaj następujący element w sekcji PropertyGroup i zapisz plik.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Po dodaniu tego elementu sekcja PropertyGroup powinna teraz wyglądać następująco:

    <PropertyGroup>
      <OutputType>WinExe</OutputType>
      <TargetFramework>netcoreapp3.0</TargetFramework>
      <UseWPF>true</UseWPF>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  3. Kliknij prawym przyciskiem myszy projekt ContosoExpenses.Core i wybierz polecenie Załaduj ponownie projekt.

  4. Kliknij prawym przyciskiem myszy projekt ContosoExpenses.Data i wybierz Wyładuj projekt. Ponownie kliknij prawym przyciskiem myszy projekt, a następnie wybierz pozycję Edytuj ContosoExpenses.Data.csproj.

  5. Dodaj ten sam wpis w sekcji PropertyGroup i zapisz plik.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Po dodaniu tego elementu sekcja PropertyGroup powinna teraz wyglądać następująco:

    <PropertyGroup>
      <TargetFramework>netstandard2.0</TargetFramework>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  6. Kliknij prawym przyciskiem myszy projekt ContosoExpenses.Data i wybierz polecenie Załaduj ponownie projekt.

Dodawanie pakietu zgodności systemu Windows

Jeśli spróbujesz teraz skompilować projekt ContosoExpenses.Core i projekt ContosoExpenses.Data, zauważysz, że poprzednie błędy są teraz naprawione, ale podobne do tych w bibliotece ContosoExpenses.Data nadal występują jeszcze pewne błędy.

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

Te błędy są wynikiem konwersji projektu ContosoExpenses.Data z biblioteki .NET Framework (specyficznej dla systemu Windows) do biblioteki .NET Standard, która może działać na wielu platformach, w tym Linux, Android, iOS i nie tylko. Projekt ContosoExpenses.Data zawiera klasę o nazwie RegistryService, która wchodzi w interakcję z rejestrem — koncepcją tylko dla systemu Windows.

Aby rozwiązać te błędy, zainstaluj pakiet NuGet Windows Compatibility . Ten pakiet zapewnia obsługę wielu interfejsów API specyficznych dla systemu Windows do użycia w bibliotece .NET Standard. Biblioteka nie będzie już wieloplatformowa po użyciu tego pakietu, ale nadal będzie ona dotyczyć platformy .NET Standard.

  1. Kliknij prawym przyciskiem myszy na projekt ContosoExpenses.Data.

  2. Wybierz pozycję Zarządzaj pakietami NuGet.

  3. W oknie menedżera pakietów NuGet kliknij pozycję Przeglądaj. Microsoft.Windows.Compatibility Wyszukaj pakiet i zainstaluj najnowszą stabilną wersję.

    Instalowanie pakietu NuGet

  4. Teraz spróbuj ponownie skompilować projekt, klikając prawym przyciskiem myszy projekt ContosoExpenses.Data i wybierając polecenie Kompiluj.

Tym razem proces kompilacji zostanie ukończony bez błędów.

Testowanie i debugowanie migracji

Teraz, gdy projekty są kompilowane pomyślnie, możesz przystąpić do uruchamiania i testowania aplikacji, aby sprawdzić, czy występują jakieś błędy środowiska uruchomieniowego.

  1. Kliknij prawym przyciskiem myszy projekt ContosoExpenses.Core i wybierz Ustaw jako projekt startowy.

  2. Naciśnij F5, aby uruchomić projekt ContosoExpenses.Core w debugerze. Zobaczysz wyjątek podobny do poniższego.

    Wyjątek wyświetlany w programie Visual Studio

    Ten wyjątek jest zgłaszany, ponieważ po usunięciu zawartości z pliku csproj na początku migracji usunięto informacje o akcji Kompilacja dla plików obrazów. Poniższe kroki rozwiązały ten problem.

  3. Zatrzymaj debuger.

  4. Kliknij prawym przyciskiem myszy projekt ContosoExpenses.Core i wybierz polecenie Rozładuj projekt. Kliknij ponownie prawym przyciskiem projekt, a następnie wybierz Edytuj ContosoExpenses.Core.csproj.

  5. Przed zamykającym elementem Project dodaj następujący wpis:

    <ItemGroup>
      <Content Include="Images/*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
  6. Kliknij prawym przyciskiem myszy projekt ContosoExpenses.Core i wybierz polecenie Załaduj ponownie projekt.

  7. Aby przypisać Contoso.ico do aplikacji, kliknij prawym przyciskiem myszy projekt ContosoExpenses.Core i wybierz opcję Właściwości. Na otwartej stronie kliknij listę rozwijaną pod Ikona i wybierz pozycję Images\contoso.ico.

    Ikona Contoso we Właściwościach Projektu

  8. Kliknij przycisk Zapisz.

  9. Naciśnij F5, aby uruchomić projekt ContosoExpenses.Core w debugerze. Upewnij się, że aplikacja jest teraz uruchomiona.

Dalsze kroki

Na tym etapie samouczka pomyślnie przeprowadzono migrację aplikacji Contoso Expenses do platformy .NET Core 3. Teraz możesz przystąpić do , część 2: Dodaj kontrolkę InkCanvas platformy UWP, korzystając z XAML Islands.

Uwaga / Notatka

Jeśli masz ekran o wysokiej rozdzielczości, możesz zauważyć, że aplikacja wydaje się bardzo mała. Ten problem zostanie rozwiązany w następnym kroku samouczka.