Partilhar via


Parte 1: Migrar o aplicativo Contoso Expenses para o .NET Core 3

Esta é a primeira parte de um tutorial que demonstra como modernizar um aplicativo de área de trabalho WPF de exemplo chamado Contoso Expenses. Para obter uma visão geral do tutorial, pré-requisitos e instruções para baixar o aplicativo de exemplo, consulte Tutorial: Modernizar um aplicativo WPF.

Nesta parte do tutorial, você migrará todo o aplicativo Contoso Expenses do .NET Framework 4.7.2 para o .NET Core 3. Antes de iniciar esta parte do tutorial, certifique-se de abrir e criar o de exemplo ContosoExpenses no Visual Studio 2019.

Observação

Para obter mais informações sobre como migrar um aplicativo WPF do .NET Framework para o .NET Core 3, consulte esta série de blogs.

Migrar o projeto ContosoExpenses para o .NET Core 3

Nesta seção, você migrará o projeto ContosoExpenses no aplicativo Contoso Expenses para o .NET Core 3. Você fará isso criando um novo arquivo de projeto que contém os mesmos arquivos que o projeto ContosoExpenses existente, mas tem como destino o .NET Core 3 em vez do .NET Framework 4.7.2. Isso permite que você mantenha uma única solução com as versões .NET Framework e .NET Core do aplicativo.

  1. Verifique se o projeto ContosoExpenses atualmente tem como alvo o .NET Framework 4.7.2. No Explorador de Soluções, clique com o botão direito do rato no projeto ContosoExpenses, escolha Propriedadese confirme que a propriedade Destino da estrutura no separador Aplicação está definida para o .NET Framework 4.7.2.

    .NET Framework versão 4.7.2 para o projeto

  2. No Windows Explorer, navegue até a pasta C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses e crie um novo arquivo de texto chamado ContosoExpenses.Core.csproj.

  3. Clique com o botão direito do mouse no arquivo, escolha Abrir com e abra-o em um editor de texto de sua escolha, como o Bloco de Notas, o Visual Studio Code ou o Visual Studio.

  4. Copie o seguinte texto para o ficheiro e guarde-o.

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <UseWPF>true</UseWPF>
     </PropertyGroup>
    
    </Project>
    
  5. Feche o arquivo e volte para a solução ContosoExpenses no Visual Studio.

  6. Clique com o botão direito do mouse sobre a solução ContosoExpenses e selecione Adicionar -> Projeto Existente. Selecione o ficheiro ContosoExpenses.Core.csproj que acabou de criar na diretoria C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses para adicioná-lo à solução.

O ContosoExpenses.Core.csproj inclui os seguintes elementos:

  • O elemento Project especifica uma versão SDK do Microsoft.NET.Sdk.WindowsDesktop. Isso se refere a aplicativos .NET para Windows Desktop e inclui componentes para aplicativos WPF e Windows Forms.
  • O elemento PropertyGroup contém elementos filho que indicam que a saída do projeto é um executável (não uma DLL), tem como destino o .NET Core 3 e usa WPF. Para uma aplicação Windows Forms, usarias um elemento UseWinForms em vez do elemento UseWPF.

Observação

Ao trabalhar com o formato .csproj introduzido com o .NET Core 3.0, todos os arquivos na mesma pasta que o .csproj são considerados parte do projeto. Portanto, você não precisa especificar todos os arquivos incluídos no projeto. Você deve especificar apenas os arquivos para os quais deseja definir uma ação de compilação personalizada ou que deseja excluir.

Migrar o projeto ContosoExpenses.Data para o .NET Standard

A solução ContosoExpenses inclui uma biblioteca de classes ContosoExpenses.Data que contém modelos e interfaces para serviços e destina-se ao .NET Framework 4.7.2. Os aplicativos .NET Core 3.0 podem usar bibliotecas do .NET Framework, desde que não usem APIs que não estejam disponíveis no .NET Core. No entanto, o melhor caminho de modernização é mover suas bibliotecas para o .NET Standard. Isso garantirá que sua biblioteca seja totalmente suportada pelo seu aplicativo .NET Core 3.0. Além disso, você pode reutilizar a biblioteca também com outras plataformas, como web (através do ASP.NET Core).

Para migrar o projeto ContosoExpenses.Data para o .NET Standard:

  1. No Visual Studio, clique com o botão direito do mouse no projeto ContosoExpenses.Data e escolha Descarregar Projeto. Clique com o botão direito do mouse no projeto novamente e escolha Editar ContosoExpenses.Data.csproj.

  2. Exclua todo o conteúdo do arquivo de projeto.

  3. Copie e cole o XML a seguir e salve o arquivo.

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    
  4. Clique com o botão direito do rato no projeto ContosoExpenses.Data e escolha Recarregar Projeto.

Configurar pacotes e dependências do NuGet

Ao migrar os projetos ContosoExpenses.Core e ContosoExpenses.Data nas seções anteriores, você removeu as referências ao pacote NuGet dos projetos. Nesta seção, você adicionará essas referências de volta.

Para configurar os pacotes NuGet para o projeto ContosoExpenses.Data :

  1. No projeto ContosoExpenses.Data, expanda o nó Dependências. Observe que a seção NuGet está ausente.

    pacotes NuGet

    Se você abrir o Packages.config no Gerenciador de Soluções , encontrará as referências 'antigas' dos pacotes NuGet usados no projeto quando ele estava usando o .NET Framework completo.

    Dependências e pacotes

    Aqui está o conteúdo do arquivo Packages.config . Você notará que todos os Pacotes NuGet têm como destino o .NET Framework 4.7.2 completo:

    <?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. No projeto ContosoExpenses.Data , exclua o arquivo Packages.config .

  3. No projeto ContosoExpenses.Data, clique com o botão direito do rato no nó Dependências e escolha Gerir Pacotes NuGet.

gerir pacotes NuGet...

  1. Na janela Gestor de Pacotes NuGet, clique em Procurar. Procure o Bogus pacote e instale a versão estável mais recente.

    Pacote NuGet falso

  2. Procure o LiteDB pacote e instale a versão estável mais recente.

    pacote NuGet LiteDB

    Você pode estar se perguntando onde essa lista de pacotes NuGet está armazenada, já que o projeto não tem mais um arquivo packages.config. Os pacotes NuGet referenciados são armazenados diretamente no arquivo .csproj. Você pode verificar isso exibindo o conteúdo do arquivo de projeto ContosoExpenses.Data.csproj em um editor de texto. Você encontrará as seguintes linhas adicionadas no final do arquivo:

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

    Observação

    Você também pode notar que está instalando os mesmos pacotes para este projeto do .NET Core 3 que os usados pelos projetos do .NET Framework 4.7.2. Os pacotes NuGet suportam multi-targeting. Os autores de bibliotecas podem incluir diferentes versões de uma biblioteca no mesmo pacote, compiladas para diferentes arquiteturas e plataformas. Esses pacotes suportam o .NET Framework completo, bem como o .NET Standard 2.0, que é compatível com projetos do .NET Core 3. Para obter mais informações sobre as diferenças entre .NET Framework, .NET Core e .NET Standard, consulte .NET Standard.

Para configurar pacotes NuGet para o projeto ContosoExpenses.Core:

  1. No projeto ContosoExpenses.Core, abra o ficheiro packages.config. Observe que ele atualmente contém as seguintes referências que visam o .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>
    

    Nas etapas a seguir, você verá as versões do .NET Standard dos pacotes MvvmLightLibs e Unity. As outras duas são dependências baixadas automaticamente pelo NuGet quando você instala essas duas bibliotecas.

  2. No projeto ContosoExpenses.Core , exclua o arquivo Packages.config .

  3. Clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Gerenciar Pacotes NuGet.

  4. Na janela Gestor de Pacotes NuGet, clique em Procurar. Procure o Unity pacote e instale a versão estável mais recente.

    pacote Unity

  5. Procure o MvvmLightLibsStd10 pacote e instale a versão estável mais recente. Esta é a versão .NET Standard do MvvmLightLibs pacote. Para este pacote, o autor optou por empacotar a versão .NET Standard da biblioteca em um pacote separado da versão do .NET Framework.

    pacote MvvmLightsLibs

  6. No projeto ContosoExpenses.Core, clique com o botão direito do mouse no nó Dependências e escolha Adicionarde Referência .

  7. Na categoria Projetos > Solução, selecione ContosoExpenses.Data e clique em OK.

    Adicionar referência

Desativar atributos de montagem gerados automaticamente

Neste ponto do processo de migração, se você tentar criar o projeto ContosoExpenses.Core , verá alguns erros.

.NET Core 3 criar novos erros

Esse problema está acontecendo porque o novo formato .csproj introduzido com o .NET Core 3.0 armazena as informações do assembly no arquivo de projeto em vez do arquivo AssemblyInfo.cs . Para corrigir esses erros, desative esse comportamento e deixe o projeto continuar a usar o arquivo AssemblyInfo.cs .

  1. No Visual Studio, clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Descarregar Projeto. Clique com o botão direito do mouse no projeto novamente e escolha Editar ContosoExpenses.Core.csproj.

  2. Adicione o seguinte elemento na secção PropertyGroup e guarde o ficheiro.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Depois de adicionar esse elemento, a seção PropertyGroup agora deve ter esta aparência:

    <PropertyGroup>
      <OutputType>WinExe</OutputType>
      <TargetFramework>netcoreapp3.0</TargetFramework>
      <UseWPF>true</UseWPF>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  3. Clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Recarregar projeto.

  4. Clique com o botão direito do mouse no projeto ContosoExpenses.Data e escolha Descarregar projeto. Clique com o botão direito do mouse no projeto novamente e escolha Editar ContosoExpenses.Data.csproj.

  5. Adicione a mesma entrada na secção PropertyGroup e guarde o ficheiro.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Depois de adicionar esse elemento, a seção PropertyGroup agora deve ter esta aparência:

    <PropertyGroup>
      <TargetFramework>netstandard2.0</TargetFramework>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  6. Clique com o botão direito do rato no projeto ContosoExpenses.Data e escolha Recarregar Projeto.

Adicionar o Pacote de Compatibilidade do Windows

Ao tentares agora compilar os projetos ContosoExpenses.Core e ContosoExpenses.Data, verás que os erros anteriores foram corrigidos, mas ainda existem alguns erros na biblioteca do ContosoExpenses.Data semelhantes a estes.

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

Esses erros são resultado da conversão do projeto ContosoExpenses.Data de uma biblioteca do .NET Framework (que é específica para Windows) para uma biblioteca .NET Standard, que pode ser executada em várias plataformas, incluindo Linux, Android, iOS e muito mais. O projeto ContosoExpenses.Data contém uma classe chamada RegistryService, que interage com o Registro, um conceito somente do Windows.

Para resolver esses erros, instale o pacote NuGet de Compatibilidade do Windows . Este pacote fornece suporte para muitas APIs específicas do Windows a serem usadas em uma biblioteca .NET Standard. A biblioteca não será mais multiplataforma depois de usar este pacote, mas ainda terá como alvo o .NET Standard.

  1. Clique com o botão direito do mouse no ContosoExpenses.Data projeto.

  2. Escolha Gerenciar pacotes NuGet.

  3. Na janela Gestor de Pacotes NuGet, clique em Procurar. Procure o Microsoft.Windows.Compatibility pacote e instale a versão estável mais recente.

    Instalar o pacote NuGet

  4. Agora tente compilar novamente o projeto, clicando com o botão direito do mouse no projeto ContosoExpenses.Data e escolhendo Compilar.

Desta vez, o processo de compilação será concluído sem erros.

Testar e depurar a migração

Agora que os projetos estão sendo criados com êxito, você está pronto para executar e testar o aplicativo para ver se há algum erro de tempo de execução.

  1. Clique com o botão direito no projeto ContosoExpenses.Core e escolha Definir como Projeto de Arranque.

  2. Pressione F5 para iniciar o projeto ContosoExpenses.Core no depurador. Você verá uma exceção semelhante à seguinte.

    Exceção exibida no Visual Studio

    Esta exceção é levantada porque quando o utilizador removeu o conteúdo do arquivo .csproj no início da migração, removeu as informações sobre a ação de Build para os arquivos de imagem. As etapas a seguir corrigem esse problema.

  3. Parar o depurador.

  4. Clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Descarregar projeto. Clique com o botão direito do mouse no projeto novamente e escolha Editar ContosoExpenses.Core.csproj.

  5. Antes de fechar elemento Project, adicione a seguinte entrada:

    <ItemGroup>
      <Content Include="Images/*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
  6. Clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Recarregar projeto.

  7. Para atribuir o Contoso.ico ao aplicativo, clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Propriedades. Na página aberta, clique na lista suspensa em ícone e selecione Images\contoso.ico.

    ícone da Contoso nas Propriedades do Projeto

  8. Clique em Salvar.

  9. Pressione F5 para iniciar o projeto ContosoExpenses.Core no depurador. Confirme que a aplicação agora está a funcionar.

Próximos passos

Neste ponto do tutorial, você migrou com êxito o aplicativo Contoso Expenses para o .NET Core 3. Agora você está pronto para Parte 2: Adicionar um controle UWP InkCanvas usando Ilhas XAML.

Observação

Se você tiver uma tela de alta resolução, você pode notar que o aplicativo parece muito pequeno. Você abordará esse problema na próxima etapa do tutorial.